攻防世界逆向入门题之no-strings-attached

继续开启全栈梦想之逆向之旅~
这题是攻防世界逆向入门题的no-strings-attached


下载附件:

扔入Exepeinfo中查壳和其他信息:

如图所示,32位ELF的linux文件,照例扔如IDA32位中查看代码信息,跟进Main函数:

看到四个函数,由于才疏学浅,以为flag不在这里,还去查看了一下strings窗口:

也没有flag字眼,有点懵(还是没觉得main的四个函数有问题,还是太菜了啊)。查了查资料,说flag操作就在这四个函数里,于是有回头去看这四个函数,先看导入表,看那些是自带的函数:

可以看见第一个setlocale是自带的函数,第二第三个双击跟踪进去是打印函数,banner(横幅),猜测应该是打印开头信息的,那么就剩下第四个函数了,双击查看内容:

这里有个decrypt函数,中文名是加密,不在导入表中说明不是系统函数,后面的if判断条件是输入,还有个比较的wcscmp函数,后面两个wprintf分别是success 和access这些成功和拒绝的字符串地址。
fgetws函数是从输入流stdin中获取0x2000个字符给ws,也就是说s2是关键了,s2由decrypt函数得出,decrypt是用户自定义函数,在这里学到了非系统函数的英文名会是题目给的暗示,所以这里是加密操作后与输入的比较,只要输入后与加密后的s2一样就会打印success或access这些字符串,那flag自然也在加密函数中了。

双击跟进:

没学过cwchar.h库,没办法,继续查资料(wp),攻防世界admin官方的wp是用GDB的动态调试,我以前也没用过gdb,也才发现linux也可以动态调试,真的由于太菜长见识了:
学GDB学了两天还是三天,然后才跟着admin的wp复现了一遍,这里说一下自己的分析:
由于这种题是和用户输入的比较的,也就是说flag就在s2里面,我们可以在内存调试中提取s2的值,然后解密即可得到flag。(通常s2就是flag,因为如果s2还是加密的flag的话就不用完了)

我还尝试print s2指令输出变量s2的值,因为我以为和IDA显示的一样,flag赋值给了s2,后来才想起IDA是根据自己的规则给无法解析变量名赋值的,也就是说在IDA里变量是s2这个名字,但是实际上程序里并没有s2这个变量名,所以只能查看寄存器了,毕竟函数是先返回到eax寄存器中再移动到变量中的。

还有就是admin的wp中给的是n指令然后查看eax寄存器的值,可是n指令执行的是一行高级语言命令,而ni和si才是单步执行一条汇编指令,所以不要调着调着跳过对应指令都不知道。

还有就是这里虽然是decrypt产出flag后赋值给了s2,但是双击s2跟踪显示的是s2初始的地址和值,而s2初始并没有什么东西,decrypt函数是用初始有值的&s进行加密操作后才产出flag赋值给s2的,所以不能用双击跟踪s2初始值的方式得到flag。

&s双击后跟进的字符串值:

这里是引用
GDB动态调试

gdb ./no_strings_attached 将文件加载到GDB中

之前通过IDA,我们知道关键函数是decrypt,所以我们把断点设置在decrypt处,b在GDB中就是下断点的意思,及在decrypt处下断点

我们要的是经过decrypt函数,生成的字符串,所以我们这里就需要运行一步,GDB中用n来表示运行一步高级语言代码

然后我们就需要去查看内存了,去查找最后生成的字符串

通过IDA生成的汇编指令,我们可以看出进过decrypt函数后,生成的字符串保存在EAX寄存器中,所以,我们在GDB就去查看eax寄存器的值

x:就是用来查看内存中数值的,后面的200代表查看多少个,wx代表是以word字节查看看,$eax代表的eax寄存器中,在这里我们看到0x00000000,这就证明这个字符串结束了,因为,在C中,代表字符串结束的就是"\0",那么前面的就是经过decrypt函数生成的flag

这里要特别注意一下:操作是面对反汇编低级语言来操作的,所以是对照着内存来操作的!

复现后的结果如图:

这里是内存数,所以不用像小端一样反过来(可能只有我才会傻到反过来吧~),十六进制数解密后就是flag了:

flag="393434377b796f755f6172655f616e5f696e7465726e6174696f6e616c5f6d7973746572797d";
print(flag.decode('hex'))

注意,这里请用python2执行,具体原因自己查吧。

补充:之前用的是GDB查看内存,这是一种新方式,那么老方法——用IDA还是要掌握的,这里借鉴了一篇博客的操作来复现,并附上自己的见解:

https://blog.csdn.net/liuxiaohuai_/article/details/110002845?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-3.control

首先回顾前面的话:

由于这种题是和用户输入的比较的,也就是说flag就在s2里面,我们可以在内存调试中提取s2的值,然后解密即可得到flag。

flag在s2内,不用gdb查看内存的话s2就无法得知,但是s2是由decrypt这个加密函数得出的,而这里decrypt传入的加密参数&s和&dword_8048A90都可以双击跟踪内存查看初始值,而且decrypt的内部构造也有,那么我们直接提取出&s和&dword_8048A90这两个参数的值,然后仿照decrypt写个一样加密流程的脚本得出的不也是flag吗?


事实上的确如此!所以我们去提取&s和&dword_8048A90的内容,那么这里就涉及提取脚本了:直接给前面博客的脚本:

提取&s

addr=0x08048AA8   #数组的地址
arr = []
for i in range(39):    #数组的个数arr.append(Dword(addr+4* i))
print(arr)

提取&dword_8048A90:

addr=0x08048A90   #数组的地址
arr = []
for i in range(6):    #数组的个数arr.append(Dword(addr+4* i))
print(arr)

这里就是简单地提取数据而已啊,后来我发现其实手工也可以,只要对着地址一个个转为dd再转成十进制即可,都是要用邮件,所以IDA功能还是要看IDA权威指南多学学啊!


然后就是用python仿照decrypt加密流程写脚本了:
原来的:

仿照的(也是前面博客的):

s = [5178, 5174, 5175, 5179, 5248, 5242, 5233, 5240, 5219, 5222, 5235, 5223, 5218, 5221, 5235, 5216, 5227, 5233, 5240, 5226, 5235, 5232, 5220, 5240, 5230, 5232, 5232, 5220, 5232, 5220, 5230, 5243, 5238, 5240, 5226, 5235, 5243, 5248]
a = [5121, 5122, 5123, 5124, 5125]
v6 = len(s)
v7 = len(a )
v2 = len(s)v4=0
while v4<v6:for i in range(0,5):if(i<v7 and v4<v6):s[v4]-=a[i]v4 += 1else:break
for i in range (38):print(chr(s[i]),end="")

注意:前面c++中v4++是先赋值后再加,所以到了python中v4+=1就放在赋值后面了。

解毕!敬礼!

攻防世界逆向入门题之no-strings-attached相关推荐

  1. 攻防世界逆向入门题之open-source

    攻防世界逆向入门题之open-source 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向入门题的open-source 下载附件得到源码: #include <stdio.h> #in ...

  2. 攻防世界逆向入门题之流浪者

    攻防世界逆向入门题之流浪者 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向入门题的流浪者 下载附件,照例扔入exeinfope中查看信息: 32位PE文件无壳,照例扔入ida32中查看伪代码: 是没 ...

  3. 攻防世界 crypto 入门题之easy_RSA

    攻防世界 crypto 入门题之easy_RSA 继续开启全栈梦想之逆向之旅~ 这题是攻防世界crypto 入门题之easy_RSA RSA的密码学听说了好久,主要是战队的队友之前有研究,而我却是一点 ...

  4. 攻防世界逆向高手题的key

    攻防世界逆向高手题之key 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的key . . (这里积累第一个经验) 这道题,嗯~搞了好久,主要是我的IDA是7.5版本的,其他博客上的大多都是7 ...

  5. 攻防世界Misc入门题之掀桌子

    攻防世界Misc入门题之掀桌子 继续开启全栈梦想之逆向之旅~ 这题是攻防世界Misc入门题之掀桌子 题目是一串16进制数,因为只有0~f,不是base64,直接扔到十六进制转字符串: 好的,不知道转了 ...

  6. 攻防世界Misc入门题之坚持60s

    攻防世界Misc入门题之坚持60s 继续开启全栈梦想之逆向之旅~ 这题是攻防世界Misc入门题之坚持60s 下载附件,一开始我默认用压缩包对jar文件,搞到一解压出来还以为是某个游戏存档,后来才发现是 ...

  7. 攻防世界逆向高手题之reverse-for-the-holy-grail-350

    攻防世界逆向高手题之reverse-for-the-holy-grail-350 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的reverse-for-the-holy-grail-350 ...

  8. 攻防世界逆向高手题之dmd-50

    攻防世界逆向高手题之dmd-50 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的dmd-50 下载附件,照例扔入exeinfope中查看信息: 64位ELF文件,无壳,照例扔入IDA64位中 ...

  9. 攻防世界逆向高手题之re2-cpp-is-awesome

    攻防世界逆向高手题之re2-cpp-is-awesome 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向高手题的re2-cpp-is-awesome 下载附件,照例扔入exeinfope中查看信息: ...

最新文章

  1. wordpress搭建构架笔记
  2. 2015.7.17( NOI2015 day1 )
  3. VS C# DateTimePicker()的小技巧
  4. 2012年度最新免费web开发设计资源荟萃
  5. Windows 环境下 Chrome浏览器崩溃“STATUS_INVALID_IMAGE_HASH”
  6. peoplesoft系统与sap_sap顾问或者peoplesoft顾问转行做自研系统顾问的为什么那么少?...
  7. [Unity] 无脚本导出 Texture 为 PNG
  8. MySQL启动关闭服务巨慢,这样解决!
  9. splitlines
  10. node事件循环 EventEmitter 异步I/O Buffer缓冲区 模块
  11. excel线性拟合的斜率_邵励治的机器学习 2 / 100 天:「简单线性回归」
  12. 微服务数据库分库设计解决方案(跨库关联查询、分布式事务处理)
  13. 无涯社区分享:链网+DID,区块链应用破局的关键 | ArcBlock 活动
  14. 乳清白蛋白纳米粒修饰生物素
  15. 31位圈内大佬解读DApp困惑:“爆款”也难优秀!
  16. 操作系统接口之批处理作业
  17. .NET Core、Xamarin、.NET Standard和.NET Framework四者之间的区别
  18. Android 动态修改app名称(市场和手机中显示两个不同的名称)
  19. 宠物医院小程序开发,轻松引流
  20. 数据结构课程设计银行储蓄系统

热门文章

  1. 构建能源物联网,助力电力物联网数据服务
  2. NBoot EBoot
  3. el-input 不能输入的解决办法
  4. python b站动态转发、动态评论区抽奖(已打包成exe,可以下载食用)
  5. 物理隔离网闸技术概述
  6. 怎么写计算机论文摘要,计算机概论论文摘要怎么写 计算机概论论文摘要范文参考...
  7. 【pickle】详解python中的pickle模块(常用函数、示例)
  8. 高通平台手机开发之LCD
  9. java某公司面试题
  10. 无人叉车市场现状与发展趋势分析|无人叉车专题(一)