2017. 7. 23. 18:27

## Samsung CTF_2017(dfa, defense)


[Summary]

1. Integer overflow 취약점을 패치하는 문제

2. read에서 bof 취약점이 터지도록 유도하는 취약점을 패치하면 됨.


[Analysis] 


[그림 1] dfa 문제


 
 이 문제는 Defense 문제로 소스코드가 주어지고 거기에 있는 하나의 취약점을 찾아 패치를 한 후 서버에 보내면

되는 문제였다. dfa.zip파일을 다운로드 받으면 4개의 소스파일이 주어지는데 그 중 취약점이 존재하는 소스코드는

"auto.c"였다. 이 소스 코드 중 취약점이 존재하는 부분은 아래 [그림 2]와 같다.



[그림 2] "auto.c" 중 취약한 소스코드 일부


 위 [그림 2]의 if 문 내부에 namelen + 1 > 0x100에서 overflow가 발생하여 조건문을 우회할 수 있는 

integer overflow 취약점이 존재한다. 조금 자세히 풀어쓰자면 namelen에 0xffffffff라는 값이 들어갔다고

쳤을 경우 namelen + 1의 값은 0이 되고 0과 0x100과 비교했을 때 조건문을 우회할 수 있게 된다.


 이 때 아래 빨간 네모박스의 코드에서 read()함수를 실행하여 namelen(0xffffffff)만큼 linebuf 배열에 

사용자 입력을 받으면서 최종적으로 버퍼 오버플로우 취약점을 유발시키게 된다.


 따라서 위 취약점은 아래 [그림 3]과 같이 패치할 수 있다.



[그림 3] 취약한 소스코드 패치


  이렇게 취약한 소스코드를 패치한 후 해당 파일을 base64하여 서버에 전송하면 아래 [그림 4]와 같이

플래그를 확인할 수 있다. 소스코드를 base64로 인코딩하여 전송하는 스크립트는 아래와 같다.


[Exploit Code] - dfa_exploit.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from pwn import *
#import hexdump
 
context(arch='amd64',os='linux')
#local=True
local=False
 
if local:
    p = process("./card")
else:
    p = remote("dfa.eatpwnnosleep.com"9999)
 
#binary = ELF("./")
 
raw_input()
 
if __name__ == '__main__':
    print p.recv(1024)
    p.send('auto.c\n')
    print p.recv(1024)
    result = open("/home/holinder4s/Desktop/SCTF_2017/Defense/dfa/auto_wj.c""rb").read()
    result = base64.b64encode(result)
    p.send(result+'\n')
    print p.recv(1024)
    print p.recv(1024)
    print p.recv(1024)
    print p.recv(1024)
    print p.recv(1024)
    #p.interactive()
 
cs


[Get Flag~~!!!!]


[그림 4] flag 확인



끝~!






Posted by holinder4S