攻防世界逆向入门题之getit

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

下载附件,照例扔入exeinfope中查看消息:

64位ELF文件,然后扔入IDA查看伪代码信息:

让我们来分析这段C代码含义:首先我看到的是strcpy(filename, “/tmp/flag.txt”);
stream = fopen(filename, “w”);
因为这里有flag字眼,所以我一下就看到了它,这里说写入了/tmp/flag.txt,也因为是tmp文件,所以不是管理员也可以写入,后面显眼的
fclose(stream);
remove(filename);
也说明了一运行完程序就删除文件,所以我们没法在运行完程序后找到该文件

现在分析中间的循环写入语句:

  for ( i = 0; i < strlen(&t); ++i )   //我是认为&t是flag的长度{fseek(stream, p[i], 0);    //定位到开头偏移p[i]位置处,fputc(*(&t + p[i]), stream);  //在上一句的定位处写入&t起始字符串的p[i]偏移的单个字节fseek(stream, 0LL, 0);    //重新定位到0且没有偏移fprintf(stream, "%s\n", u); //写入完整字符u,双击跟踪u发现是*******************************************,就是一个覆盖干扰}

这里的p[i]双击跟踪长这个样子:(p[i]鼠标长时间停留显示int[43]类型):

hex图比较直观:
可以看到p[i]数组存放的是无序的整数,也就是说每次在/tmp/flag.txt文件中写入的flag是不按顺序写的,且每次只出现一个字符,需要自己排序。

开头的循环判断中的&t在前面出现过,长这个样子:

我当时看着逼格挺高的,记得看不懂就没鸟了,后来发现前面的循环才是生成的flag代码,后面只是将flag分成单个单个字符写进去而已。
所以让我们分析一下前面代码:

  v9 = __readfsqword(40u);     //这里我也不清楚,是windows的API函数,从偏移量的指定位置读取内存相对 FS 段开头LODWORD(v5) = 0;      //这里把__in64的v5(longlong型)转地址类型为32为DWORD,即取底32位为0while ( (signed int)v5 < strlen(s) )   //这里signed int是有符号整形,s双击跟踪是c61b68366edeb7bdce3c6820314b7498这样的无序字符串{if ( v5 & 1 )   //这里是v5的1位和1进行与操作,因为后面有LODWORD(v5) = v5 + 1,所以v3在这里会1、-1这样反复横条strlen(s)次v3 = 1;elsev3 = -1;*(&t + (signed int)v5 + 10) = s[(signed int)v5] + v3;  //这里是赋值,因为v5一开始是0,所以从&t+10开始赋值,&t双击跟踪是SharifCTF{????????????????????????????????},第10位刚好是第一个?,赋值是从s[0]开始-1,s[1]+1,s[2]-1这样赋值,分别对应不断递增的v5和反复横跳的v3,所以这里也可以手动计算第一个?是b,第二个?是7这样。LODWORD(v5) = v5 + 1;   //v5底32位加1,其实就是v5加1}

好了,分析完了,有好几种做题方法,
第一个静态计算,就像我上面分析flag生成代码手动计算一样。

第二种动态截停,截止flag生成后的位置,查看寄存器即可。

第三种静态计算,仿写c语言脚本或python脚本安装一样的算法生成flag。

第四种动态截停,在IDA远程调试中截停在remove(filename);最后这里,或者return 0;也行,然后在IDA中写python脚本命令输出&t地址的字符串即可。

第五个动态截停,在linux中用GDB或IDA远程调试断点断在fprintf(stream, “%s\n”, u); 这里,然后每次记录写入的一个flag字符。

第一种就不说了,自己计算即可。

第二种:GDB动态调试,首先我们知道了下面strlen(&t)的t是flag程序运行后生成的flag,那我们把鼠标放在那一行上看一下下面的反汇编行数,如下所示是400824,那么我们在反汇编窗口跟上。
可以看到反汇编中400824行的确是_strlen函数,而它上面就是把&t移入了edi,所以在GDB中我们断点400824,然后查看edi寄存器即可。

所需命令:

b *0x400824
r

我这里用的是hyperpwn插件:

可以看到flag就在RDI寄存器里。

第三种:仿写C语言代码或python代码静态计算:
python代码:

key1="c61b68366edeb7bdce3c6820314b7498"
v5=0
flag=""
while v5 < len(key1):if v5 & 1:v3=1else:v3=-1flag+=chr(ord(key1[v5])+v3)v5+=1
print(flag)


C语言代码:(复制别人的)

#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>#pragma warning(disable:4996)int main(void)
{char v3;__int64 v5;char s[] = "c61b68366edeb7bdce3c6820314b7498";char t[] = "SharifCTF{????????????????????????????????}";v5 = 0;while (v5 < strlen(s)) {if (v5 & 1)v3 = 1;elsev3 = -1;*(t + v5 + 10) = s[v5] + v3;v5++;}printf("%s", t);system("PAUSE");return 0;
}

第四种在IDA处动态截停:
直接双击t看到?已经被替换成flag了,这里是断点在return
或者在IDA下面输入框下输入get_bytes(0x6010E0,50)也一样能打印出对应地址的数组
第五种:嗯~第五种就不演示了,大致像这个样子吧,不过他这个是整理过的,真实的是不按顺序出现的。

解毕!敬礼!

攻防世界逆向入门题之getit相关推荐

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

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

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

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

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

    攻防世界逆向入门题之no-strings-attached 继续开启全栈梦想之逆向之旅~ 这题是攻防世界逆向入门题的no-strings-attached 下载附件: 扔入Exepeinfo中查壳和其 ...

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

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

  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中查看信息: ...

  10. 攻防世界逆向高手题之re5-packed-movement

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

最新文章

  1. 江西省普通高中学业水平考试计算机,2020江西省普通高中学业水平考试缴费平台...
  2. 如何判断Javascript对象是否存在
  3. python中的拷贝
  4. pthread-win32在VC2005下的使用
  5. 第 三 十 八 天:Linux 的 LVM 逻 辑 卷 管 理
  6. C语言 pthread_create
  7. postgresql数据库导入导出
  8. Linux查看某个进程的磁盘IO读写情况
  9. 安装mysql的zip包
  10. java web个人博客开发(一需求获取和需求分析文档)
  11. Unity HDRP 光照贴图
  12. java json接口加密解密
  13. vscode Run coder 支持c++11
  14. 使用Voxelmorph配准IXI:数据预处理之颅骨去除及仿射对齐
  15. 【List、Set】学习笔记
  16. 使用 Node 开发一个多人对战的射击游戏
  17. LoadRunner参数化
  18. matlab变量与常量、数据类型
  19. mac安装破解版xmind笔记
  20. labview插件下载

热门文章

  1. 如何将其他注册商处的域名申请转出并转入阿里云(图文教程)
  2. HIT 软件构造2019春 Lab2
  3. python list列表的乘除法
  4. android开发者模式调试程序,Android用开发者模式进行调试时出现的问题及解决方案...
  5. 美股相关交易规则与业务知识
  6. ffmpeg gif拆分成多张jpg
  7. adb:设置手机屏幕亮度
  8. 四大金融资产管理公司的起起伏伏
  9. selenium调用edge driver的坑
  10. 我的求职之路——首战:毕马威(KPMG)笔试