해당 문제를 어떻게 풀어야하는지에 대한 지인의 요청으로 포스팅을 하겠되었습니다. 일단 해당 문제는 oob를 활용해 canary, pie leak 하는 문제입니다. 하지만 ret를 덮기위해 입력받는 함수가 scanf로, 해당 함수로 입력을 받는 다는 것입니다. 이에 다음과 같은 문자를 입력할 경우 그 위치에서 입력을 중단됩니다. \x09, \x0a, \x0b, \x0c, \x0d, \x20 이를 생각하고 leak 한 값을 가지고 ret 을 덮어 win 을 실행하려고 하면 이상한게 보입니다. 3바이트 주소중 두번째 바이트가 0xa 라는 겁니다. 이에 win으로 바로 ret를 줄 수 없습니다. ( 에전에 작성된 라이트업을 그냥 쓰면 안될 겁니다. pie_base 가 개행문자를 벗어날 수 있는 값이 나올때 까지..
gdb로 바이너리 분석해 보니, v4에 입력한 값을 전달한다는 것을 알 수 있다. 즉 sub_40EE70은 atoi이다. 실제로 문자 “ABCD”를 넣으니 필터링 된것을 알 수 있다. 즉 atoi 정수 형태의 문자만 입력받아 정수로 바꿔준다. int result; // eax char *v4; // [rsp+8h] [rbp-28h] char buf[24]; // [rsp+10h] [rbp-20h] BYREF unsigned __int64 v6; // [rsp+28h] [rbp-8h] v6 = __readfsqword(0x28u); result = (unsigned __int8)++loop_cnt; if ( loop_cnt == 1 ) { write(1u, "addr:", 5uLL); read(0, buf..
Mind Control (ubuntu 20.04) int sub_4008BD() { puts("Mind Print"); return puts(&byte_6010A0[index]); } 먼저 문제를 보면 2번 메뉴에서 다음과 같은 함수를 호출한다. ssize_t sub_40082F() { puts("Mind Control!"); printf("Size : "); __isoc99_scanf("%d", &index); printf("Your Mind : "); if ( index > 128 ) exit(1); return read(0, &byte_6010A0[index], 8uLL); // got overwrite // } 1번 메뉴를 입력하면 다음과 같이 size(idx)를 입력하고 이를 참고해 입력을 받는..
으아.. 방금 까지 작성했던거 날라가서 빠르게 적겠습니다. Warmup 문제의도: 자칭 tiny program이라고 하는 만큼 인자 전달을 위한 gadget도 없고 프로그램 내에 binding 되어 있는 함수 자체도 write, read로 매우 제약이 되어 있다. 이때 너는 익스를 할 수 있냐 일단 문제 파일들을 다운 받으면 Dockerfile 이 존재하는데, 이를 확인하면 우분투 18.04 라는 것을 알 수 있다. 이를 참고하여 libc를 구한다. 필자는 Docker를 이용하여 실제 환경을 구축하여 진행. 그리고 해당 문제의 보호 기법은 다음과 같다. Arch: amd64-64-little RELRO: Full RELRO Stack: No canary found NX: NX enabled PIE: No..