목록Write-up/HackCTF (9)
R4mbb

예 또는 아니요 문제다. ㅇㅂㅇ 실행해보고 ida로 열어보자. if ( v10 == v6 * v5

프로그램에 PIE 보호기법이 걸려있는 문제인 것 같다. 먼저, PIE에 대해 알아보자. PIE (Position Independent Executable) : 위치 독립 실행파일, 실행할 때마다 매핑되는 주소가 어디든지 상관없이 실행되는 파일로 매핑되는 주소가 매번달라 바이너리의 주소를 랜덤화하여 바이너리의 특정 주소의 값을 수정하는 것과 같은 공격을 방어한다. 먼저, 코드를 확인해보자. PIE 보호기법에 의해서 함수의 base 주소는 계속 바뀐다. 때문에 함수의 offset을 이용하면 될 것 같다. 먼저, welcome에서 ret위치를 구해보자. 입력받은 위치로부터 22byte에 ret주소가 존재한다. 이번엔 welcome과 j0n9hyun 함수의 offset을 구해보자. welcome = 0x909 ..

홍ㅎ항ㅎ항항 오프셋 관련 문제인 것 같다. IDA로 코드를 확인해보자. print_flag 함수가 존재한다. 이 함수와 select_func()를 활용하면 될 것 같다. 먼저, select_func 함수를 잘 보자. [스택구조] dest[42byte] | ??? | v3[12byte] | ??? | SFP[4byte] | RET[4byte] 이렇게 구성되어 있다. strncpy 함수를 보면 src의 31byte만큼 dest에 복사를 한다. 42 - 12 = 30 이다. 1byte만큼 더 복사를 할 수 있다. v3에 1byte만큼 덮어씌는 것이 가능해진다. 그렇다면 이 1byte를 이용해서 v3를 print_flag주소로 바꿔야한다. 먼저, two함수의 주소와 print_flag함수의 주소를 알아보자. t..

심플 오버플로우 문제다. IDA로 코드를 확인해보자. buf의 메모리 주소를 출력하고 buf에 입력을 받는다. gets에서 BOF가 생긴다. 우분투에서 실행해보자. buf 에 입력받을 때 쉘코드를 넣고 ret위치에 buf 주소를 넣고 실행하면 될 것 같다. buf에서 ret까지의 거리를 구해보자. 0xffffd08c - 0xffffd000 = 8c (140) shellcode + dummy + buf_addr 이런식으로 BOF하면 될 것 같다. 익스를 짜보자. 성공했다. 플래그는 HackCTF{y0u_d1d_7h3_45516nm3n7_5ucc355fully!} 이다.

x64 환경 BOF 문제이다. ida로 코드를 확인해보자. buf의 주소를 출력해주고 buf의 입력을 받는다. buf의 ret까지의 거리를 peda로 확인해보자. 실행을 해보면 buf의 주소와 입력을 받는다. get 부분에 bp를 걸고 ret을 찾아보자. 입력받은 rsp+27952(6D30)를 확인해주면 +8byte 위치에 ret주소가 들어가있다. 쉘코드를 입력해주고 rsp+27960의 ret 위치에 buf의 주소를 넣으면 BOF가 될 것이다. 익스를 짜보자. 쉘코드는 64bit 쉘코드를 사용하였고, 계속해서 바뀌는 buf의 주소를 받아와 처리하였다. 플래그는 HackCTF{s000000_5m4ll_4nd_5m4ll_51z3_b0f} 이다.

64비트 BOF 문제인 듯 하다. ida로 코드를 확인해보자. 저 함수를 실행하면 쉘이 따질 것이다. 해보자! 1. s 부터 ret까지의 거리는 0x120이다. 2. callMeMaybe 주소(8byte)로 36번 도배하자. 익스를 짜보자. 성공적으로 익스가 되었다. 플래그는 HackCTF{64b17_b0f_15_51mpl3_700} 이다.

BOF 문제다. 파일을 다운받고 한번 실행해보자. 두 개의 입력을 받는다. IDA로 코드를 확인해보자. s 변수는 main함수 내에 있고 name 변수는 보이지 않는다. 전역변수다. name의 주소는 0x0804A060 이다. 이번엔 gdb로 prob1을 확인해보자. 음.. gets에 입력되는 부분에 bp를 걸고 어디에 입력되는지 확인해보자. 이렇게 두 개의 변수에 각각 AAAA와 AAAABBBBCCCCDDDD를 입력했다. 스택값을 확인해보자. s 변수에는 0xffffd164 부터 입력이 됐다. 그런데 빨간 박스 부분을 보니 메인함수 ret 때 호출이 되는 주소인 것을 확인할 수 있었다. 그렇다면 s 변수에서 입력받을 때 0xffffd17c 에 쉘코드를 넣어 실행시켜주면 될 것 같다. SCENARIO 1..

먼저 파일을 윈도우와 우분투에 받자. 그리고 IDA로 디스어셈해보자. 문제의 이름이 BOF인 만큼 fgets() 함수에서 입력받는 과정에서 버퍼 사이즈를 잘 못 지정해서 취약점이 발생한 것 같다. fgets() 함수에 대해 알아보자. fgets(char * str, int num, FILE * stream) - 첫 번째 인자는 읽어들인 문자열을 저장할 char 배열을 가리키는 포인터이다. - 두 번재 인자는 마지막 NULL문자를 포함하여 읽어들일 최대 문자 수이다. - 세 번재 인자는 문자열을 읽어들일 스트림의 FILE 객체를 가리키는 포인터이다. - 리턴값은 성공했을 경우 char 배열을 리턴하고 아무런 문자가 없거나 오류가 발생했을 때는 NULL이 리턴된다. shell() 함수가 존재한다. gdb로 ..