rem don’t modify the caller’s environment setlocal --------------------主要是这里添加了自动修改java环境变量的语句------------ set JAVA_HOME=C:\Users\daily\MyFile\asset\java\1.8 set Path=%JAVA_HOME%\bin;%Path%
rem Change current directory and drive to where the script is, to avoid rem issues with directories containing whitespaces. cd /d %~dp0
for /f “delims=” %%a in (‘bin\archquery’) do set vmarch=%%a
@某不知名网友: 调试方法在文章里说明了:漏洞分析
如果确实是按照文章做的还是无法连接,可以检查以下步骤:看看 gdbsever 交叉编译是否正常、gdb 与 gdbsever 版本是否一致(如果是无法连接,与版本关系应该不大)、宿主机与 QEMU 虚拟机能否正常通信(一般 QEMU 虚拟机重启之后可能需要重新设置 IP 才能与宿主机连接)、前期网桥相关的操作是否配置好
@某不知名网友: 师傅,能问一下你是如何在系统级调试的吗?我使用gdb和gdbserver远程连接不成功,可能是gdb和gdbserver版本不匹配,然后没法调试就算不出libc基址,就卡在这里了,,
@butt3rf1y: 谢谢你的支持哈哈哈,加油
博主写的文章条理好清晰,博客也好好看,看着好丝滑,呜呜呜呜呜二进制逆向好难啊学得我道心破碎好希望有一天能成为博主这样厉害的人
@uf4te: 感谢回复,不知道什么原因呢,先把原因归结到qemu版本上吧,我是直接用apt安装的qemu-mips-static,等有时间再来试试编译安装。
@某不知名网友: 感谢反馈,那这就很奇怪了,你的情况应该是 qemu 用户态的原因,但我当初确实是修改了偏移地址后就正常 getshell 了,我所做的操作应该都记录在文章里了,会不会是 qemu 版本原因?
师傅,我这边使用qemu-mipsel-static依然还是无法getshell,gdb调试发现程序也确实执行到了system,参数也对,但在system函数中没有走到execl(“/bin/sh”, &off_5A450, &off_5A454, a1, 0)这个分支,if条件是由fork()函数确定的,是不是像winmt师傅说的那样用户态qemu模拟不支持多线程导致fork()失败,可能您那边getshell成功是因为别的原因?
@uf4te: 好的,太感谢了。我在研究研究
@某不知名网友:
你说的这种情况应该减 n 个 96,这里 80 % 96 + 113 - 96 + 32 = 129 还要再减一个 96 才在 [32,127] 之间,也就是 129 - 96 = 33,与 (80 + 113) % 96 + 32 = 33 就相等了
因为这里是逆向求余,所以可能会涉及到余数的 n 倍的问题,为了严谨已经将原文改为 Str1[i] = Str1[i] % 96 + Str1[(i * i + 123) % 21] - n * 96 + 32 了,感谢反馈
@uf4te: 我假设一种情况,如果有一次循环加密时的明文Str1[i]=80,Str[(i*i+123)%21]=113,那么按题目的加密来看,加密后的密文是(80 + 113)%96+32=33。如果按这个理解,那加密是不是80%96+113-96+32=129,可前后不等
@Vict0ry+: 按道理说只使用第一个也是可以的,因为前后两个 sprintf 都可以溢出并且传参都是 uid,但这里讨论的是如果能走到第二个 sprintf 的话需要满足什么条件,如果非要严格说只使用第一个 sprintf 的话那就得保证程序不会执行到第二个 sprintf(实际第二个执不执行都是一回事,只是可能溢出长度有所区别),感兴趣的话可以尝试一下
师傅,是这样的,我在复现这个漏洞,想请教一下:就是这边的漏洞第一个 sprintf 不可以溢出吗?利用点只能是第二个 sprintf 咩?
@某不知名网友: 是的敲错了哈哈哈,谢谢指正
sudo: dkpg: command not found
这条应该是
sudo: dpkg: command not found
遇事不决,动态调试…哈哈哈哈
虽然才刚学ret2,但是感觉GDB太重要了
感谢站长这篇文章, 让我看到了ADM(Android Device Monitor)的替代操作! 不然总是因为JDK版本太高, 且新版Android sdk删除了ADM工具, 现有教程并没有教如何在没有ADM的帮助下, 找到JDWP需要转发的目标端口, 使用旧版ADM和JDK1.8也只能反复修改环境变量…
我贴出自己的解决办法:
@echo off
rem Copyright © 2012 The Android Open Source Project
rem
rem Licensed under the Apache License, Version 2.0 (the “License”);
rem you may not use this file except in compliance with the License.
rem You may obtain a copy of the License at
rem
rem http://www.apache.org/licenses/LICENSE-2.0
rem
rem Unless required by applicable law or agreed to in writing, software
rem distributed under the License is distributed on an “AS IS” BASIS,
rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
rem See the License for the specific language governing permissions and
rem limitations under the License.
rem don’t modify the caller’s environment
setlocal
--------------------主要是这里添加了自动修改java环境变量的语句------------
set JAVA_HOME=C:\Users\daily\MyFile\asset\java\1.8
set Path=%JAVA_HOME%\bin;%Path%
rem Change current directory and drive to where the script is, to avoid
rem issues with directories containing whitespaces.
cd /d %~dp0
for /f “delims=” %%a in (‘bin\archquery’) do set vmarch=%%a
start lib\monitor-%vmarch%\monitor
@awigwu76: 这是 32 位程序栈上传递参数时,call 和 ret 函数调用方式的区别,在将 “/bin/sh” 作为 system() 参数时,中间需要垫一个返回地址,这里的 4 字节其实就是作为返回地址的,因为 CTF 目的就是拿到 shell,所以拿到 shell 以后返回到哪里就所谓了,你也可以把这 4 字节改成 main 地址,就可以让主函数执行两次
具体可以看一下这篇文章,讲的挺详细的:PWN之所谓的堆栈平衡,论layload中添加pop exx; ret 指令的作用
我想问一下,“这里需要用 4 个字节作为 system(“/bin/sh”) 的返回地址,使栈保持平衡”,这句话,是哪里的操作让栈不平衡了,小可以为我解答一下吗
见过写的最详细的了,有点好奇大佬是怎么学习堆的,看网上面的资料好乱啊,有什么资料推荐吗
@某不知名网友: 谢谢支持,一起加油
写的真好!!!!很少见到这么详细的分析帖了!!!!!!
好厉害,不知道博主学了几年了,二进制也太难了呜呜
碎片整理花费时间可能比较长,因为是机械硬盘,固态很快,效果很好。
今天是本站第一次收到赞助哈哈哈,特别感谢 @q1uTruth 对本站的支持,点击查看详情
很开心我的文章可以得到大家的认可,也很开心可以帮助到大家,我也会继续努力,共勉
@某不知名网友: 哈哈
讲的很全面,牛逼
@Qin: 仿佛已经到下半年开学了,没办法,感觉时间真的过的好快啊啊啊啊
2000年研三?
@某不知名网友: 谢谢哈哈哈哈
看着真舒服
@illustager: 谢谢支持~
好棒的博客
@uf4te: 感谢作者大大
@某不知名网友: 是的,因为后端的资源可能涉及一些个人信息,而且 Hexo 只是一个将后端的资源整合成 Html 的框架,目前仅开源了这些 Html 文件,如果你对博客 UI 比较感兴趣的话,可以参考我在友情链接中列举的博主,他们有很多专门优化 UI 的文章可以借鉴
作者大大仅仅开源了前端的代码吗
@uf4te: 我悟了,之前是没想清楚,谢谢哥
@某不知名网友: 步骤①右边后半部分不取余数是因为分了两种情况,因为Str1本身是可见字符构成的字符串,取值在[32,127]。那么如果Str1[(i * i + 123) % 21]小于96的话取余就是它本身,如果Str1[(i * i + 123) % 21]大于96的话取余结果就是它本身-96
步骤②那个是根据①里面的式子移项来的,并不是对①式的左边取了余数,相当于②中的式子里右边的Str是加密后的密文、左边的Str就是flag的明文
可能没有写的比较清楚
哥,最后那个算法是怎么变过来的?本身整体取余96为什么变化后只有前半部分取余后半部分就可以不取了,而是去-96
@某不知名网友: 哈哈哈,我当时配 Ubuntu 16.04 的环境一整套下来也弄了挺久,主要是时代在变化,很多东西已经与当年不一样了,谁也不会知道按照以前的教程会出现什么离奇的 bug,网上的教程也急需更新了,所以我也出了一个亲身实践版,很高兴能帮到你
大佬太感谢了,我用16.04配置pwndbg配了两天,真的想死
@某不知名网友: 其他字节有没有影响这个我倒没有自己亲自编译尝试过,前四字节主要是 Python 版本,5 - 8 字节应该没啥影响,后 8 字节可能会有影响吧,具体的可能自己编译一个文件试试会比较好
pyc文件的前16个字节时只有前四个字节对编译有影响码
@uf4te: 哈哈
@momo:
@Capricious: 收到!
@Capricious: okok
测试一下
一楼用来占位 ~~