JarvisOJ-PWN
0x00 XMAN-LEVEL0
IDA-F5,稍微浏览一下就能到关键的vulnerable_function
1 | ssize_t vulnerable_function() |
很明显的一个栈溢出
但是checksec一下会发现开了NX,就是说不能无脑的放一个shellcode跳回来执行,这时候就考虑一下有没有可以利用的函数
再看一眼IDA 有一个callsystem函数,会执行system(‘/bin/sh’)
现在就很明确了
溢出,修改RIP,跳转到callsystem即可
这里有一点要注意,payload并不是'A'*0x80+p64(RET_ADDRESS)
,因为vulnerable_function
这个函数返回时会调用read()
1 | return read(0, &buf, 0x200uLL); |
会先push当前函数的RBP入栈保存现场,之后才是开辟0x80个空间的buf
所以会在buf
的空间后面用8个字节保存vulnerable_function
的$RBP
因此实际的payload是'A'*0x88+p64(RET_ADDRESS)
1 | from pwn import * |
0x01 XMAN-LEVEL1
IDA-F5 找到vulnerable_function()
1 | ssize_t vulnerable_function() |
一看就是个栈溢出printf
会打印出buf
的地址
所以就覆盖$EIP
跳到buf
这里和LEVEL0一样,要考虑vulnerable_function()
的$EBP
,因为这个ELF是32位的程序,所以地址是4字节长度的地址
这里在buf里放一个shellcode,shellcode从exploit-db上找一个就行
最后的payload=shellcode+'A'*(0x8C-len(shellcode))+p32(buf_address)
1 | from pwn import * |
0x02 XMAN-LEVEL2
IDA-F5
1 | ssize_t vulnerable_function() |
同样是明显栈溢出,但是和前两道有点区别
函数里直接使用了system(),这里最开始想的是把system("echo 'Hello World!'")
替换成system("/bin/sh");
,但是感觉有点麻烦,翻了一下函数列表,有system()
,再shift+F12
翻一下,能找到0X0804A024处有'/bin/sh'
那么就换一种思路,修改返回地址到system()
,传入'/bin/sh'
并运行
但是有一点要注意,调用system()
之后要先传入一个返回地址(随便填即可),再传入'/bin/sh'
才行payload='A'*0x8C+p32(system_addr)+'A'*4+p32(binsh_addr)
1 | from pwn import * |