'SCTF dfa'에 해당되는 글 1건
- 2017.07.23 [Samsung CTF_2017] dfa(Defense)
## 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 확인
끝~!
'CTF writeup' 카테고리의 다른 글
[Samsung CTF_2017] Easyhaskell(reversing) (0) | 2017.07.23 |
---|---|
[Samsung CTF_2017] Buildingblocks(Coding) (0) | 2017.07.23 |
[Samsung CTF_2017] Readflag(Attack) (0) | 2017.07.23 |
[Secuinside CTF_2017] snake(reversing) (0) | 2017.07.22 |
[Secuinside CTF_2017] TrippleRotate(reversing) (0) | 2017.07.22 |