file 명령어로 문제 파일을 확인해보면 리눅스 32비트 실행파일임을 확인할 수 있다.
gdb로 메인 함수를 보면 다음과 같다.
저번 문제와 다르게 main 함수에서 시스템 함수를 실행하고 있지 않고, fgets 함수로 입력값만 받고 있다.
info func로 이 프로그램에서 정의된 함수 목록을 확인하면 다음과 같다.
system 함수가 사용되고 있고, shell 이라는 함수가 정의되어 있다. shell 함수의 내용을 보면 다음과 같다.
shell 함수안에서 system 함수가 사용되고 있으므로 프로그램에서 shell 함수를 실행시키면 system 함수가 실행되서 쉘을 딸 수 있을 것 같다.
우선 main함수를 ida 헥스레이로 확인하면 다음과 같다.
128 크기의 배열을 선언하였고, v5라는 비어있는 포인터 변수가 선언되어 있다.
다시 main 함수의 어셈에서 한줄씩 실행하다 보면 main+59, call eax 를 실행했을 때 프로그램을 실행하고 값을 입력했을 경우 출력되는 문자열이 나온다. 이것이 main 함수 hex-ray에서 8번째 줄 v5(); 에 해당하는 값 같고, fgets 함수가 실행될 때 오버플로우를 발생시켜 v5에 저장된 값을 내가 원하는 값으로 덮으면 될 것 같다.
또한 shell 함수를 ida 헥스레이로 확인하면 다음과 같다.
시스템 함수로 dash 쉘을 실행시키고 있다. 따라서 v5의 값을 덮어서 shell() 함수를 실행시키도록 해야 할 것 같다. v5는 포인터 변수이기 때문에 v5에 shell 함수의 주소가 들어가면 v5(); 코드를 실행했을 때 shell 함수가 실행 될 것이다.
shell 함수의 주소는 info func를 통해 함수 정보에서 확인할 수 있고, 0x804849b 이다.
main 함수에서 call eax; 에 breakpoint를 걸고 실행하여 A를 130개 넣어보니 입력받는 문자열을 저장할 배열의 크기는 128이지만 변수의 범위를 넘어서서도 A로 덮이는 것을 확인할 수 있다.
따라서 A를 128개 채우고 이후에 shell 함수의 주소로 덮으면 v5 값이 shell 함수의 주소로 덮여서 v5();를 실행하면 shell 함수가 실행될 것이다.
다음과 같이 익스 코드를 짜면 플래그를 확인할 수 있다.
1
2
3
4
5
6
|
from pwn import *
p = remote("ctf.j0n9hyun.xyz", 3001)
pay = "A"*128 + "\x9b\x84\x04\x08"
p.sendline(pay)
p.interactive()
|
cs |
'Project H4C Study Group' 카테고리의 다른 글
[Project H4C][Hack CTF] 내 버퍼가 흘러넘친다!!! (0) | 2021.03.18 |
---|---|
[Project H4C][Hack CTF] Basic_FSB (0) | 2021.03.17 |
[Project H4C][Hack CTF] Basic_BOF #1 (0) | 2021.03.16 |
[Project H4C] C언어 코딩도장(12) (0) | 2021.03.12 |
[Project H4C] C언어 코딩도장(11) (0) | 2021.03.11 |