测试文件:https://adworld.xctf.org.cn/media/task/attachments/8ef2f7ef55c240418f84b3c514a7a28a

准备

得知

  • 64位文件

2.IDA打开

反编译得到C语言代码

 int __cdecl main(int argc, const char **argv, const char **envp)
{
char v3; // al
__int64 v5; // [rsp+0h] [rbp-40h]
int i; // [rsp+4h] [rbp-3Ch]
FILE *stream; // [rsp+8h] [rbp-38h]
char filename[]; // [rsp+10h] [rbp-30h]
unsigned __int64 v9; // [rsp+28h] [rbp-18h] v9 = __readfsqword(0x28u);
LODWORD(v5) = ;
while ( (signed int)v5 < strlen(s) )
{
if ( v5 & )
v3 = ;
else
v3 = -;
*(&t + (signed int)v5 + ) = s[(signed int)v5] + v3;
LODWORD(v5) = v5 + ;
}
strcpy(filename, "/tmp/flag.txt");
stream = fopen(filename, "w");
fprintf(stream, "%s\n", u, v5);
for ( i = ; i < strlen(&t); ++i )
{
fseek(stream, p[i], );
fputc(*(&t + p[i]), stream);
fseek(stream, 0LL, );
fprintf(stream, "%s\n", u);
}
fclose(stream);
remove(filename);
return ;
}

2.1 常量参数值

接着其中一些参数的值

.data:00000000006010A0                 public s
.data:00000000006010A0 ; char s[]
.data:00000000006010A0 s db 'c61b68366edeb7bdce3c6820314b7498',
.data:00000000006010A0 ; DATA XREF: main+25↑o
.data:00000000006010A0 ; main+3F↑r
.data:00000000006010C1 align 20h
.data:00000000006010E0 public t
.data:00000000006010E0 ; char t
.data:00000000006010E0 t db 53h ; DATA XREF: main+65↑w
.data:00000000006010E0 ; main+C9↑o ...
.data:00000000006010E1 aHarifctf db 'harifCTF{????????????????????????????????}',
.data:000000000060110C align 20h
.data: public u
.data: u db '*******************************************',
.data: ; DATA XREF: main+A5↑o
.data: ; main+13F↑o
.data:000000000060114C align 20h
.data: public p
.data: ; int p[43]
.data: p dd 1Eh ; DATA XREF: main+E1↑r
.data: ; main+104↑r

其中值得我们注意的是t的值,t的值应该是0x53+'harifCTF{????????????????????????????????}',即

SharifCTF{????????????????????????????????}

t很有可能是储存flag的数组。

2.2 代码分析

代码整体上可以分为3个部分

1~11 变量定义初始化

12~20 定义flag值

20~34 flag值写入文件

因此我们只需要将第二部分复现,输出flag即可。

2.3 flag获取代码

#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 = ;
while (v5 < strlen(s)) {
if (v5 & )
v3 = ;
else
v3 = -;
*(t + v5 + ) = s[v5] + v3;
v5++;
}
printf("%s", t); system("PAUSE");
return ;
}

3. get flag!

SharifCTF{b70c59275fcfa8aebf2d5911223c6589}

最新文章

  1. Entity Framework Code First Migrations--EF 的数据迁移
  2. Hibernate-模板模式
  3. Ubuntu 14.04 编译安装 husky
  4. Java数据库——JDBC 2.0操作
  5. Go 中的反射要点
  6. 在mac os下的Apache服务器的cgi中运行python
  7. inputs
  8. MongoDB的安装配置
  9. js特效第九天
  10. libvirt-adabddad
  11. 【转载】ADO.NET与ROM的比较(1):ADO.NET实现CRUD
  12. CloudXNS首次使用体验
  13. Android:CheckBox控件
  14. Java基础-常用的String方法
  15. npm下设置NODE_ENV下mac与windows的差异
  16. InfluxDB概念和基本操作
  17. Hive中小表与大表关联(join)的性能分析【转】
  18. Twitter OA prepare: K-complementary pair
  19. csv到mysql数据库如何分割
  20. URAL题解三

热门文章

  1. Codeforces Round #425 (Div. 2) - B
  2. Windows系统中,循环运行.bat/.exe等文件
  3. [web 安全]逻辑漏洞之密码重置
  4. layui树形表格支持非异步和异步加载
  5. Linux下统计当前文件夹下的文件个数
  6. spring boot 集成 websocket 实现消息主动推送
  7. Arithmetic Sequence
  8. 为 PhpStorm 配置 Xdebug 来调试代码
  9. Spring Boot 的单元测试
  10. SpringMVC-设计模式