728x90
반응형
1. intro
2. code 및 분석
2.1. code
init
int init()
{
int result; // eax
int fd; // [rsp+8h] [rbp-8h]
result = open("/dev/null", 1);
fd = result;
if ( result != -1 )
{
result = dup2(result, 1);
if ( result != -1 )
{
result = dup2(fd, 2);
if ( result != -1 )
result = close(fd);
}
}
return result;
}
format_f
unsigned __int64 format_f()
{
char format[56]; // [rsp+10h] [rbp-40h] BYREF
unsigned __int64 v2; // [rsp+48h] [rbp-8h]
void *retaddr; // [rsp+58h] [rbp+8h]
v2 = __readfsqword(0x28u);
LODWORD(retaddr) = 0;
__isoc99_scanf("%16s", format);
printf(format);
return __readfsqword(0x28u) ^ v2;
}
2.2. 분석
init 함수에서는 표준 출력과 표준 에러를 /dev/null으로 돌려버린다.
즉 아무것도 출력이 안된다는 소리.
format_f 함수에서는 16글자를 받아 출력하는데 여기서 포맷스트링이 발생한다.
다만 format_f 함수에서 main으로 돌아오는 return address의 뒷부분 4 byte를 0으로 날려버리기에 무조건 seg.fault가 발생한다.
3. 취약점 확인 및 공격 준비
3.1. 취약점
format string bug
3.2. 공격 준비
format string bug의 새로운 점을 배울 수 있었던 문제.
머릿속으로만 특정 값을 스택이나 메모리에서 가져와서 %n의 인자(?)로 쓸 수 없나? 하는 고민을 많이 했는데
역시나 있었다.
이는 별도로 정리해둬야겠다.
더불어 표준 출력을 날려버리기에 shell을 획득한 이후에도 이 설정이 유지되어 아무것도 출력되지 않는데,
리눅스 명령어가 약해서 이를 어떻게 출력할 수 있을지 다소 고민했다.
솔직히 H4C pwnable 문제 중에 제일 배울 것이 있었던 문제였지 않나 생각한다.
728x90
반응형
'Wargame > H4C' 카테고리의 다른 글
System Hacking - Simple_VM (0) | 2023.07.01 |
---|---|
System Hacking - Notepad (0) | 2023.07.01 |
System Hacking - apple pie (0) | 2023.07.01 |
System Hacking - bof (0) | 2023.07.01 |
System Hacking - Qualification (0) | 2023.07.01 |