목록전체 글 (67)
R4mbb

들어가서 소스를 확인해보니,,, strcpy에서 취약점이 터지는걸 알 수 있다. 프로그램을 실행 해보자. 실행할 때 인자로 값을 1개 이상 넘겨주어야 하고, 인자가 그대로 출력이 된다. gdb로 까보자. main함수 프롤로그 다음에 스택이 0x100만큰 확보가 된걸 볼 수 있다. 그 다음 cmp에서는 [$ebp+8]과 1을 비교한 뒤 피연산자1이 피연산자2 보다 크면 아래 jg에서 점프하게 된다. 소스코드상 if(argc < 2) 부분에 해당한다. gdb에서 확인해보자. 확인해보니 피연산자1의 값이 더 크다. jg에서 로 점프하게 된다. 그리고 밑에 strcpy까지 가서 스택을 살펴보자. 여기서 스택 맨 위에 들어있는 주소값이 buffer이고 바로 위 [esp+0x4] 부분이 argv[1] 이다. buf..

예 또는 아니요 문제다. ㅇㅂㅇ 실행해보고 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} 이다.