首先执行file命令得到如下信息

ELF 64-bit LSB executable, x86-64

尝试用IDA64打开,定位到关键函数main发现无法F5,尝试了修复无果,于是用gdb动态调试一发。

在scanf处下断点

b *0x0400660

输入12346789之后next

=> 0x40066c <main+102>:	call   0x4004c0 <strlen@plt>
0x400671 <main+107>: mov DWORD PTR [rbp-0x8],eax
0x400674 <main+110>: cmp DWORD PTR [rbp-0x8],0xe

可以看到调用了strlen函数,然后将长度和0xe比较,于是知道flag长度为0xe。

再次运行

Please input flag:abcdefghijklmn

通过长度验证之后可以看到

0x40067a <main+116>:	mov    edx,0x600b00
0x40067f <main+121>: lea rax,[rbp-0x20]
0x400683 <main+125>: mov rdi,rax
0x400686 <main+128>: call rdx

接着调用了0x600b00处的内容,于是

b *0x600b00
c(ontinue)

然后看到一连串的数

   0x600b08 <judge+8>:	mov    BYTE PTR [rbp-0x20],0x66
0x600b0c <judge+12>: mov BYTE PTR [rbp-0x1f],0x6d
0x600b10 <judge+16>: mov BYTE PTR [rbp-0x1e],0x63
=> 0x600b14 <judge+20>: mov BYTE PTR [rbp-0x1d],0x64
0x600b18 <judge+24>: mov BYTE PTR [rbp-0x1c],0x7f
0x600b1c <judge+28>: mov BYTE PTR [rbp-0x1b],0x6b
0x600b20 <judge+32>: mov BYTE PTR [rbp-0x1a],0x37
0x600b24 <judge+36>: mov BYTE PTR [rbp-0x19],0x64
0x600b28 <judge+40>: mov BYTE PTR [rbp-0x18],0x3b
0x600b2c <judge+44>: mov BYTE PTR [rbp-0x17],0x56
0x600b30 <judge+48>: mov BYTE PTR [rbp-0x16],0x60
=> 0x600b34 <judge+52>: mov BYTE PTR [rbp-0x15],0x3b
0x600b38 <judge+56>: mov BYTE PTR [rbp-0x14],0x6e
0x600b3c <judge+60>: mov BYTE PTR [rbp-0x13],0x70
0x600b40 <judge+64>: mov DWORD PTR [rbp-0x4],0x0
0x600b47 <judge+71>: jmp 0x600b71 <judge+113>

这串数字在后面会用到,接着调试

RAX: 0x7fffffffe2c0 ("abcdefghijklmn")
RBX: 0x0
RCX: 0x0
RDX: 0x61 ('a')
EFLAGS: 0x206 (carry PARITY adjust zero sign trap INTERRUPT direction overflow)
[-------------------------------------code-------------------------------------]
0x600b60 <judge+96>: add rdx,rcx
0x600b63 <judge+99>: movzx edx,BYTE PTR [rdx]
0x600b66 <judge+102>: mov ecx,DWORD PTR [rbp-0x4]
=> 0x600b69 <judge+105>: xor edx,ecx

可以看到,rdx=0x61('a'),rcx=0x0,然后rdx=rdx^rcx。于是大致知道是异或加密了flag。

接着调试发现在下一次,rdx=0x62('b'),rcx=0x1。

于是知道flag[i] = key[i] ^ i && 0 <= i < strlen(flag)

而这里的key便是上面的一连串数字,脚本输出flag

#!/usr/bin/python
# -*- coding: utf-8 -*-
__Author__ = "LB@10.0.0.55" key = [0x66,0x6d,0x63,0x64,0x7f,0x6b,0x37,0x64,0x3b,0x56,0x60,0x3b,0x6e,0x70]
flag = ''
for i in range(len(key)):
flag += chr(key[i]^i)
print flag
#flag{n1c3_j0b}

>###作者: LB919
>###出处:http://www.cnblogs.com/L1B0/
>###如有转载,荣幸之至!请随手标明出处;

WHCTF-babyre的更多相关文章

  1. Whctf 2017 -UNTITLED- Writeup

    Whctf 2017 -UNTITLED- Writeup 转载请表明出处http://www.cnblogs.com/WangAoBo/p/7541481.html 分析: 下载下来的附件是一个py ...

  2. Whctf - OLDDRIVER - Writeup

    Whctf - OLDDRIVER - Writeup 转载请标明出处http://www.cnblogs.com/WangAoBo/p/7541536.html 题目: 分析: 给了10组RSA的加 ...

  3. 攻防世界 reverse BABYRE

    BABYRE   XCTF 4th-WHCTF-2017 int __cdecl main(int argc, const char **argv, const char **envp) { char ...

  4. 羊城杯wp babyre

    肝了好久,没爆破出来,就很难受,就差这题没写了,其他三题感觉挺简单的,这题其实也不是很难,我感觉是在考算法. 在输入之前有个smc的函数,先动调,attach上去,ida打开那个关键函数. 代码逻辑还 ...

  5. (笔记)CTF入门指南

    [考项分类] Web: 网页安全 Crypto: 密码学(凯撒密码等) PWN: 对程序逻辑分析 系统漏洞利用 Misc: 杂项 图片隐写 数据还原 脑洞类 信息安全有关的 Reverse: 逆向工程 ...

  6. 符号执行-基于python的二进制分析框架angr

    转载:All Right 符号执行概述 在学习这个框架之前首先要知道符号执行.符号执行技术使用符号值代替数字值执行程序,得到的变量的值是由输入变 量的符号值和常量组成的表达式.符号执行技术首先由Kin ...

  7. WHCTF2017线上小记

    第四届XCTF开始,首战因素,加上团队刚加入了两个新人的原因,还是决定一块参与一下.水了3题.2个RE和1个MISC,照顾新人,写的比较啰嗦. [MISC] PY-PY-PY 下载题目之后是一个pyc ...

  8. 【wp】HWS计划2021硬件安全冬令营线上选拔赛

    逆向手在夹缝中艰难求生系列. 这篇真的存粹是做题笔记了,对内核驱动啥的不太懂,pwn也不会,能做出来的题都是硬逆出来的( childre最后死活没整出来,后来看大佬的wp才知道对子进程有修改(.)呜呜 ...

随机推荐

  1. Educational Codeforces Round37 E - Connected Components?

    #include <algorithm> #include <cstdio> #include <iostream> #include <queue> ...

  2. ASP.NET WebAPI String 传值问题

    如果我们再WebAPI中定义了只有一个string参数的WebAPI函数,如下所示: [HttpPost] public string TrackBill(string str) { return s ...

  3. java将字符串转换为指定的时间格式

    *String dateString = "18:31:43";    try {     Date date = new SimpleDateFormat("HH:mm ...

  4. MyEclipse开发平台下如何将新建的JSP页面的默认编码格式设置为UTF-8--JSP

    新建的JSP页面原始的编码格式是ISO-8859-1(测试的MyEclipse版本为2014),它是不支持中文,在预览JSP页面时会出现乱码的现象.当然自己手动改一下编码格式就好了,但是那太过麻烦,每 ...

  5. 【BZOJ1010】【HNOI2008】玩具装箱(斜率优化,动态规划)

    [BZOJ1010][HNOI2008]玩具装箱 题面 题目描述 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一 ...

  6. 【BZOJ4827】【HNOI2017】礼物(FFT)

    [BZOJ4827][HNOI2017]礼物(FFT) 题面 Description 我的室友最近喜欢上了一个可爱的小女生.马上就要到她的生日了,他决定买一对情侣手 环,一个留给自己,一 个送给她.每 ...

  7. 比较工具diif-vimdiff-windows比较工具详解

    以文件形式比较: # diff <变动前的文件> <变动后的文件> 以表格形式比较: #vimdiff FILE_LEFT FILE_RIGHT 或 # vim -d FILE ...

  8. JavaScript的作用域

    JavaScript的作用域主要是指函数的作用域,在进行结果判断的时候十分重要,如果不清楚作用域,便很有可能导致拿不到预期的结果,也就无法顺利的进行程序的编写,在经历了一系列的学习和了解之后,对相关知 ...

  9. Gradle下载 Jar 包

    使用此方法下载Jar包的前提是已经配置好了Gradle的环境了,配置好的标志是在终端输入gradle不提示command not found. 1. 编写build.gradle文件代码: apply ...

  10. Handsontable添加超链接

    本文在上文的基础上,返回的数据中多了一个link超链接跳转的字段,,需要在Handsontable中显示超链接. <!DOCTYPE html> <html> <head ...