목록Hack/Pwnable (32)
CIDY
보호되어 있는 글입니다.

오랜만에 학기중에(포스팅을 올리는 시기는 종강 이후다.) 여유가 좀 생겨서 과제가 아닌 포너블을 잡았다. 단기적으로 pwnable.tw문제를 모두 솔브하는 것을 목표로 잡고 있는데, 무난하게 250pt짜리문제를 데려왔다. (사실 pwnable.tw문제 pt가 난도와 완전 비례한다고 생각하지는 않는다. 대표적인 예가 하루종일 머리를 싸매게 만든 calc...) __int64 __fastcall main(__int64 a1, char **a2, char **a3) { _QWORD *v3; // rcx __int64 v4; // rdx char v6[64]; // [rsp+0h] [rbp-60h] BYREF __int64 buf[2]; // [rsp+40h] [rbp-20h] BYREF char v8[16];..

진짜 역대급 삽질을 거쳐 푼 문제인데, 2.23이라는 환경이 특히 발목을 잡았던 문제이다. 우선 18.04, 20.04, 22.04의 풀이부터 소개한 뒤, 16.04(==remote)에서 성공한 풀이를 설명하겠다..(삽질의 결과 우분투 버전별로 풀이를 만들게 되었다) 일단 cpp는 초면이므로 코드를 하나하나 다 뜯어보았다. int main(int argc, char *argv[]) { setvbuf(stdin,0, 2, 0); setvbuf(stdout,0, 2, 0); setvbuf(stderr,0, 2, 0); string k; long v; set_name(); cout

// 64-bit, partial relro, nx #include void main(){ // no brute forcing sleep(3); // exploit me int buf[4]; read(0, buf, 1295); } 간단한 코드이다. 일단 partial relro니까 got overwrite는 충분히 가능하고, 오버플로우도 넉넉히 일어난다. 위와 같이 립시 함수들끼리는 차이가 얼마 안 나니까 하위 2바이트 오버라이트 후 한자리 브포를 해볼 수 있을 것 같다. 3초 * 16자리 -> 48초정도는 기다릴 수 있다. (물론 운나쁘면 그것보다 훨씬 길어질수도 있지만..) 그럼 어떻게 인자 세팅을 해주냐는건데, ROPgadget으로 가젯을 찾아봤는데 쓸 만한 게 없었다. -> csu를 하든 sigr..

#include #include unsigned long hashcode = 0x21DD09EC; unsigned long check_password(const char* p){ int* ip = (int*)p; int i; int res=0; for(i=0; i

// 32-bit, partial relro, nx #include #include #include char buf[32]; int main(int argc, char* argv[], char* envp[]){ if(argc

// 32-bit, partial relro, canary, nx, pie #include #include #include void func(int key){ char overflowme[32]; printf("overflow me : "); gets(overflowme);// smash me! if(key == 0xcafebabe){ system("/bin/sh"); } else{ printf("Nah..\n"); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; } 키값을 맞추면 쉘을 내주는 간단한 구조다. gets로 입력을 받으므로 오버플로우도 충분히 일으킬 수 있다. 그리고 카나리가 걸려있지만 그 전에 쉘이 실행되면 그만이므로 그..

잡담에 넣을까 생각했는데 아무래도 입출력함수의 특징은 포너블에 많이 이용될 것 같기 때문에 여기로 했다.(물론 아직 내가 다양한 문제를 풀어보지 않아서 그런 것일수도 있다.) getc나 putc같은 문자 입출력 함수는 문자열과 달리 널바이트라던가... 딱히 특이사항이 없을 것 같아 정리하지 않았다. *printf 사용법: printf("a"); 서식문자 인자로 들어가는 걸 제외하고 기본적으로 인자는 큰 따옴표 속 문자열 하나이다. 이와 같이 실행하면 추가 인수가 전달되었다는 경고가 뜨는 것을 확인할 수 있다. pritnf는 특별하다고 할 점이 다채로운 포맷스트링을 제외하면 딱히 없다. https://orcinus-orca.tistory.com/50?category=564770 [Ck_수업정리] 8주차(F..