将cgctf re部分移到这
Re
1,hello re
没什么可说的,拖进ida,发现几个大数字,用热键r一下,将数字变为字符串,由于是小端,将字符串倒过来就是flag 了
2,readasm2
int main(int argc, char const *argv[])
{
char input[] = {0x0, 0x67, 0x6e, 0x62, 0x63, 0x7e, 0x74, 0x62, 0x69, 0x6d,
0x55, 0x6a, 0x7f, 0x60, 0x51, 0x66, 0x63, 0x4e, 0x66, 0x7b,
0x71, 0x4a, 0x74, 0x76, 0x6b, 0x70, 0x79, 0x66 , 0x1c};
func(input, 28);
printf("%s\n",input+1);
return 0;
}
题目给了一个asm文件,里面是对func函数的描述,翻译成c语言就是

void func(char input[],int num)
{
int i=;
while(i<=num)
{
input[i]^=i;
i++;
}
}

就可以算出flag
3,wxyvm1
还是先拖入ida,可以看出函数不难理解,将我们的输入经过sub_4005B6与byte_6010c0转换后与 dword_601060比较后,正确即为flag

c="C4 34 22 B1 d3 11 97 07 DB 37 C4 06 1D FC 5B ED 98 DF 94 D8 B3 84 CC 08"
with open('wxyvm') as wxy:
b=wxy.read()
d=[]
e=[]
for i in c.split():
d.append(int(i,base=16)) for i in b.split():
e.append(int(i,base=16)) for i in range(5000):
v0=e[3*(4999-i)]
v1=e[3*(4999-i)+1]
v3=e[3*(4999-i)+2]
if v0==1:
d[v1]-=v3
elif v0==2:
d[v1]+=v3
elif v0==3:
d[v1]^=v3
elif v0==4:
d[v1]/=v3
elif v0==5:
d[v1]^=d[v3]
else :
continue
print(''.join([str(chr(int(i)%128))for i in d]))

这里的wxyvm文件是byte_6010c0的数据
运算得到flag

4,py交易
题目给了一个.pyc文件,我用了uncompyle6逆向

import base64

def encode(message):
s = ''
for i in message:
x = ord(i) ^ 32
x = x + 16
s += chr(x) return base64.b64encode(s) correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag = ''
print 'Input flag:'
flag = raw_input()
if encode(flag) == correct:
print 'correct'
else:
print 'wrong'

逻辑很好懂,将函数改一下

import base64
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
f=base64.b64decode(correct)
print(f) def encode(f):
s = ''
for i in f:
x = ord(i) - 16
x = x ^ 32
s += chr(x)
print(s)
encode(f)

运行得到flag

5,maze
有题目可以猜到是一道迷宫题,拖进ida

的确是迷宫题,用O o . 0作为上下左右。找到题目迷宫部分


由这推断到35既#处为终点,将迷宫以每行8个分隔开

  ******
* * *
*** * **
** * **
* *# *
** *** *
** *
********

走一遍得到flag

6,你大概需要一个优秀的mac
题目给了一个OS X的程序(虽然我用的是Mac,但这题不用Mac也可以做)
还是拖进ida



程序将输入xor六次后与unk_100000ED0对比
写脚本

with open('mac') as mac:
v2=mac.read()
INPUT=[] for i in v2.split():
INPUT.append(int(i,base=16))
print(INPUT) for i in range(0,10):
INPUT[i]^=173
for i in range(10,20):
INPUT[i]^=190
for i in range(20,30):
INPUT[i]^=239
for i in range(30,40):
INPUT[i]^=171
for i in range(40,len(INPUT)):
INPUT[i]^=239
for i in range(0,len(INPUT)):
INPUT[i]^=222
print(INPUT)
print(''.join(chr(i)for i in INPUT))

运行得flag
7,single
要求输入一串字符,经过三个函数的考验,




可以看出这是一个神奇的数独,将unk_602080取81个数,排成9*9的格式

 00 03 00 06 00 00 00 00 00
06 00 00 00 03 02 04 09 00
00 09 00 01 00 07 00 06 00
07 04 06 00 00 00 00 00 00
00 01 08 00 00 00 06 03 00
00 00 00 00 00 00 01 04 07
00 08 00 09 00 04 00 07 00
00 07 04 02 01 00 00 00 06
00 00 00 00 00 03 00 01 00

每行每列每九宫格为1-9不同的数,解数独后将最初unk_602080中不为零的数转化为零作为输入,得flag:flag{401095728057800001802040305000321589500479002923586000105060203300008950269750804}

8,480小时精通c++
用ida查看main

上面v5后就是加密的flag,在看汇编

在The Encrypted Flag is前有一段nop,大概是加密的函数,在函数表中找,

有个StringEncryptFunction函数
用gdb

经过之前对_X1C_CG…函数的分析,rdi为处理的数据地址,rsi为数据的字符数
set $rdi=$rax
set $rsi=36
将程序跳转到StringEncryptFunction
set $rip=0x4224f6
c

得到flag

最新文章

  1. java 使用 集合 制作学生管理系统
  2. 如何用java写出无副作用的代码
  3. 连连看bug记录
  4. DS Tree 已知后序、中序 =&gt; 建树 =&gt; 求先序
  5. PHP为什么会被认为是草根语言?
  6. echarts html传参+js请求+ashx服务 代码方式
  7. 希赛网 &gt; 问答 &gt; 数据库 &gt; MySQL数据库 &gt; MySQL的管理与维护 &gt; MySql开启远程用户登录GRANTALLPRIVILEGESON*.*TO&#39;root&#39;@&#39;%&#39;I MySql开启远程用户登录GRANTALLPRIVILEGESON*.*TO&#39;root&#39;@&#39;%&#39;I
  8. java:构造函数
  9. u盘的超级用法
  10. c语言 int (*p)[5] 类型分析
  11. Compare .NET Objects对象比较组件
  12. Git上传项目到GitHub
  13. 平安E行销扫脸打卡/人寿国寿e店云参会钉钉考勤,原来这么轻易被破解!
  14. 文件锁FileLock
  15. ORACLE设置自启动记录
  16. eclipse 更改默认主题,重写默认滚动条样式(安装DevStyle主题插件)
  17. ActiveMQ简单介绍及安装
  18. Python面向对象4:类的相关函数与属性
  19. 【极简】如何挑选合适的百度BCC,并安装宝塔控制面板
  20. springboot 注解整理

热门文章

  1. redis设置密码的问题
  2. Linux服务器攻击防御(转)
  3. python基础----斐波那契数列
  4. python学习笔记--类(一)
  5. js实现图片延迟加载原理
  6. 【异常】Caused by: java.lang.IllegalStateException: Method has too many Body parameters
  7. linux CentOS7 nginx nginx-rtmp-module搭建直播
  8. tomcat-性能优化参考
  9. 【LeetCode 36】有效的数独
  10. centos下安装java jdk1.8