攻防世界Reverse(4)

SignIn

是个ELF文件,先EP再ida打开它。在这里插入图片描述
main函数上来,就知道它大概是证明回事了!输入flag再进入sub_96A这个函数里面进行比较。
不过我们需要知道 __gmpz_init_set_str 这个函数是什么意思?就是将中间的参数以最后一个参数为进制储存到第一个参数。
__gmpz_powm 这个函数就有点不好理解了,就是v5的几次方再对后一个参数取模。
__gmpz_cmp 这个函数就是比较了。
这里用到了RSA算法,这里就不做过多的介绍,因为一时半会也介绍完!可以专门看看讲解RSA的博客!

C = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
N = 103461035900816914121390101299049044413950405173712170434161686539878160984549
E = 65537

使用yafu这个软件进行对N的分解,会出现个文档,去查看数据即可
在这里插入图片描述

P = 282164587459512124844245113950593348271
Q = 366669102002966856876605669837014229419

利用python里的gmpy2库进行计算。也可以用C的gmp库进行计算。

p = 282164587459512124844245113950593348271
q = 366669102002966856876605669837014229419
c = 0xad939ff59f6e70bcbfad406f2494993757eee98b91bc244184a377520d06fc35
n = 103461035900816914121390101299049044413950405173712170434161686539878160984549
e = 65537
d = gmpy2.invert(e,(p-1)*(q-1))

知识点

这里主要是考察RSA算法,题目本身的考点在这里。

easyRE1

解压存在两个文件,一个32位,一个64位,此时我们就先EP探查一下,然后在用ida打开32位的进行逆向!
可以通过搜索字符串找到flag:
在这里插入图片描述
难度有点低!
或者找到main函数(特别好找!)然后F5查看伪代码就可以了!
在这里插入图片描述
这道题很简单,不知道为什么出现在了这儿?

easy_Maze

先用EP探查,然后用ida打开,是个64位系统!
很轻松的可以看到里面的一些内容,是用C++写的,还是很简单的!
先分析一波主函数!
在这里插入图片描述
然后进入Step_2这个函数里面分析一波!
在这里插入图片描述
到这里看起来是个地图,原来是个迷宫题目!
在主函数中里面刚开始定义的1和-1就是地图了!坐标6和9应该就是终点了(根据上图)
在这里插入图片描述
就差地图了,找到地图说明就找到了flag了!
在这里插入图片描述
gdb动态调试!
此时写出地图就可以了(可以用个脚本写,也可以用手写个!花不了太多的时间!)
在这里插入图片描述
或者gdb调试时直接打印出内存中的值!

UNCTF{ssddwdwdddssaasasaaassddddwdds}

EASYHOOK

附件是个exe文件,很久没有见过这种的文件了!
在这里插入图片描述
和其它的exe的逆向题一样,大胆猜测一下,应该又是一个加密算法了。先EP探查一下,没有发现什么特殊的!再用ida打开。
发现是个32位的文件,且是个C++写的。
在这里插入图片描述
然后我们就进入加密函数中看看!
在这里插入图片描述
然后写个脚本!
突然发现这是个假的flag,因为按照上面的逻辑应该是v4和a1相等,直接就是strcpy的那串字符串!
然后再再再找找可能存在的函数,上面的sub_401220函数里面的sub_401220函数的里面的sub_401000函数很像加密的代码,看看!
在这里插入图片描述
此时我们就可以进入sub_401000这个函数里面看看呗!
在这里插入图片描述
此时能真正的上脚本了!
不过还是错了,这里ida弄错了,其实上面的代码也可以进入,它那个v2=0是反汇编错误!
在这里插入图片描述
看这比较好解,其实里面有许多坑!

0lag{Ho0k_w1th_Fun}

这里也有个坑!真正的flag为flag{Ho0k_w1th_Fun}
所以说要小心呀!

babymips

刚开始基本都一样!不过我还是要说一遍(凑个字数!)先EP再ida打开!发现是个MIPS指令!以前做过这类题!可以插件!也可以硬分析!可以有很多种方法,一种是7.5的ida直接反编译!或者jed这个软件,或者在低版本ida中装个插件!或者用ghidra这个软件!

不过有几点要注意!jed需要的是java8的版本,而且论坛上jeb版本其实也是不同的,其中的区别也是要注意的!
在这里插入图片描述

这里用的是Ghidra这个软件!需要配一下java环境!然后创建项目,然后将我们想要逆向的软件拖进来就可以了!在这里插入图片描述
这个软件确实有点不好用!这里有个while函数,就是把我们输入的之进行异或处理,再进入FUN_004007f0这个函数里面看看!在这里插入图片描述
它这里其实是移位,就是将一个数转成二进制,然后向左或向右移动几位!
然后上脚本!
在这里插入图片描述
这里的脚本确实借鉴了师傅的,不过用这个软件确实不舒服!而且找的时候没有ida那么舒服,确实ida用多了!

key

是个exe文件,所以先打开运行一下!发现无法运行!
那就用ida打开!
在这里插入图片描述
然后在文件夹中新建该路径中的文件!这道题涉及道简单的文件操作的问题!
在这里插入图片描述
将上个flag.txt文件建立在相应的位置!然后我就开始用xdbg调试了,od电脑给我自动删除了,原版的od有,但吾爱版的没有了!有时候电脑的自动杀毒太烦了,但又不敢长时间去关闭!
事实是od调试时间有点长,所以我们还是再多分析一下函数,我们唯一的信息就是sub_4020C0该函数是很关键!
在这里插入图片描述
此时我们可以猜测到flag.txt里面就是我们要找的flag,然后进入里面进行一系列的加密比较!
在这里插入图片描述
栈上的值没有作用,或者说它只是存储了一些我们输入时的值,此时我们需要对Memory值进行追踪,然后我们再来看看!
在这里插入图片描述
此时我们便可以看看Memory里面储存着什么值?
在这里插入图片描述
此时我们可以写个脚本!
不过这里提醒一下,就是这里显示的是数字,它也是字母,不信我们来看:
在这里插入图片描述
同理,上另一个:
在这里插入图片描述
此时再上脚本就不会有疑问了!
在这里插入图片描述
然后再补充一点!
在这里插入图片描述
还有就是新建个文件flag.txt,然后od调试到最后会再内存中看到flag的!

再再来补充一下,因为脚本的flag是不对的,所以我们又来了!看看我们是错在那里了,其实我们的原始数据错了,因为当时的我没看到在xmmword下面也有数据,也是属于xmmword的!
所以数据为themidathemidathemida\x00\x00\x00后面的\x00可以省略
idg_cni~bjbfi|gsxb


crackme

可以看到这道题做出来的人数算多的,所以我们找这道题做,毕竟先易后难(菜,哈哈不点破)
下载许多遍,它一直提醒我们有病毒,好烦!
点进去直接出现红色警告!好家伙!在这里插入图片描述
不要管,因为电脑上的病毒太多了,不差这个小小小小病毒!
在这里插入图片描述
还是这种套路难怪做出的人这么多!

在这里插入图片描述
有壳,不过这种壳还是第一次见,让我查查资料!
nSpack壳,哎说什么的都有!先看看壳吧!
esp定律法 哎要学的还是很多的!
这个od要气煞我也,还有这个游览器,我先下载吾爱破解没插件,然后我又去找插件,游览器也一直下不来,然后用谷歌下载了,气煞我也,wr的乐色!想搞个Linus的系统!
在这里插入图片描述
然后我一直F8运作着,就到了一些未知区域:
在这里插入图片描述
这里可以按Ctrl+A恢复代码!然后搜索字符串就有了!
不过这样子只有一次机会,要不然我们就又要开始刚刚的操作了,所以我们要将刚开始的操作去掉,就是去壳!
使用插件OllyDump进行脱壳!
在这里插入图片描述
然后在插件中找到OllyDump进行脱壳!
在这里插入图片描述
然后再用ida打开就可以找到源代码了!
源代码还是很简单的,主要是让我们学习到了去壳这个技能了!嗯,不错不错!在这里插入图片描述
上脚本!
原始数据很好找,这不用说了!

byte = 'this_is_not_flag'
dword = [0x12,4,8,0x14,0x24,0x5c,0x4a,0x3d,0x56,0xa,0x10,0x67,0,0x41,0,1,0x46,0x5a,0x44,0x42,0x6e,0x0c,0x44,0x72,0x0c,0x0d,0x40,0x3e,0x4b,0x5f,2,1,0x4c,0x5e,0x5b,0x17,0x6e,0xc,0x16,0x68,0x5b,0x12,0x48,0x0e]
for i in range(42):
    flag = dword[i] ^ ord(byte[i % 16])
    print(chr(flag),end='')

flag{59b8ed8f-af22-11e7-bb4a-3cf862d1ee75}


学习到了如何去除北斗壳,还是很可以的,主要是再od中分析到壳的范围,一直F8到真正的入口地址!

android-app-100

是个安卓逆向,所以此时我首先先到的是为什么在逆向里?为什么不在mobile里面?
不过也别想了,先用模拟器打开看看有什么内容!
在这里插入图片描述
既然如此,那么我们就用ida打开它,揭开它的真正的面目!说错了!用jadx打开它!
在这里插入图片描述
打开a类看看里面的内容是些什么?
在这里插入图片描述
不过这里还有个函数IsCorrect未知,但是在MainActivity类里面是有加载一个System.loadLibrary(“adnjni”)这个lib的,所以此时我们用ida打开去看看里面的一些内容,找到这个未知函数!
在这里插入图片描述
在下面有个关键比较,看看!
在这里插入图片描述
此时我们可以将那些存储的值直接输入进去看看有什么反应!
在这里插入图片描述
flag就拿到了,Sharif_CTF(833489ef285e6fa80690099efc5d9c9d)


这道题其实是安卓逆向,主要是Java写的,不过主要是判断里面的函数,有些一眼就可以知道什么意思,不过有些还是不太知道!

APK-逆向2

题目是APK逆向,但是下载的附件是exe可执行文件,这个确实有点不知所措!
在这里插入图片描述
这里先用EP探查一下看看里面的内容,要不然不知道该干什么了!
在这里插入图片描述
发现是.NET写的,,此时就要用到dnSpy该软件了!
然后点进去函数入口地址!

using System;
using System.Diagnostics;
using System.IO;
using System.Net.Sockets;
using System.Text;

namespace Rev_100
{
	// Token: 0x02000002 RID: 2
	internal class Program
	{
		// Token: 0x06000001 RID: 1 RVA: 0x00002050 File Offset: 0x00000250
		private static void Main(string[] args)
		{
			string hostname = "127.0.0.1";//链接的地址
			int port = 31337;//链接的端口
			TcpClient tcpClient = new TcpClient();
			try
			{
				Console.WriteLine("Connecting...");
				tcpClient.Connect(hostname, port);
			}
			catch (Exception)
			{
				Console.WriteLine("Cannot connect!\nFail!");
				return;
			}//链接出错
			Socket client = tcpClient.Client;
			string text = "Super Secret Key";
			string text2 = Program.read();
			client.Send(Encoding.ASCII.GetBytes("CTF{"));//送出去CTF{该段字符
			foreach (char x in text)
			{
				client.Send(Encoding.ASCII.GetBytes(Program.search(x, text2)));//接着送里面的内容
			}
			client.Send(Encoding.ASCII.GetBytes("}"));//最后的}
			client.Close();
			tcpClient.Close();
			Console.WriteLine("Success!");//提示成功
		}

		// Token: 0x06000002 RID: 2 RVA: 0x0000213C File Offset: 0x0000033C
		private static string read()
		{
			string fileName = Process.GetCurrentProcess().MainModule.FileName;
			string[] array = fileName.Split(new char[]
			{
				'\\'
			});
			string path = array[array.Length - 1];
			string result = "";
			using (StreamReader streamReader = new StreamReader(path))
			{
				result = streamReader.ReadToEnd();
			}
			return result;
		}

		// Token: 0x06000003 RID: 3 RVA: 0x000021B0 File Offset: 0x000003B0
		private static string search(char x, string text)
		{
			int length = text.Length;
			for (int i = 0; i < length; i++)
			{
				if (x == text[i])
				{
					int value = i * 1337 % 256;
					return Convert.ToString(value, 16).PadLeft(2, '0');
				}
			}
			return "??";
		}
	}
}

这里首先想用nc直接链接一下这个地址和端口,在程序启动的一瞬间进行链接,不过很明显不行!
然后我又找了一些资料(看看大佬的博客)发现我上一个方法不是不可以,但是由于程序的启动时间期限过于短,所以链接不上去,而大师傅的方法是打开一个监听,一直监听该端口,这样子就能知道该程序发生了些什么?
在这里插入图片描述
CTF{7eb67b0bb4427e0b43b40b6042670b55}
flag就出现了,这道题主要是考察我们能够监听该端口,看来得好好找找http.server库的资料了!


http.server 一个类,HTTP服务器,是一个插座服务器。TCP服务器子类。它创建并监听 HTTP 插座,将请求发送给处理程序。

server包含服务器实例
comment包含命令(请求类型)
rfile包含位于可选输入数据开头的输入流
wfile包含用于向客户端写回响应的输出流。在编写到此流时,必须使用适当遵守 HTTP 协议

上面只是列了一些简单的函数!更多了还需再找,有一个python的英文文档,不过感觉哪上面不太全!

serial-150

先用EP探测一番,看看是个什么东东!
在这里插入图片描述
然后再用ida直接打开看源代码!
在这里插入图片描述
可以看到三条消息,不过全找rodata段,在代码里找找!
在这里插入图片描述
走,看看!啥都不是,啥都没有!
所以又去找找资料(看大师傅的博客!)需要ida动态调试,好家伙!终于让我来KO这个难点了!

把ida中dbgsrv目录下的linux_server或者linux_serverx64放到linux中

在这里插入图片描述
然后将其移至到Linus上!

chmod a+x linux_serverx64改变属性,然后运行 linux_serverx64
在这里插入图片描述
在这里插入图片描述
Romote Linux debugger这个选择要选上!!!
此时就可以调试了!

在这里插入图片描述
然后接着调试!
然后调到最后了,不过还是的到一些有用的信息!
在这里插入图片描述
然后我们再接着调,这就是一次比一次有经验。
唉,着实不容易呀,隔了好几天后,有开始接受这部分,又开始再一次的调试!
在这里插入图片描述
加油!争取下一次成功!
没想到,断网了,调试中断了,气死了!!!
调试了半天还是没个所以然!
我把一些图给上来,有些是调试过不了的地方!
在这里插入图片描述
然后我们再进行这次跳转!前几次都是因为长度不够直接失败!所以这次我注意一下!
在这里插入图片描述
进去时要小心一点,一次调试成功!
在这里插入图片描述
马上就成功了!
在这里插入图片描述
然后重复这一步骤,就可以得到了flag了!
EZ9dmq4c8g9G7bAV


本题学习到了如何进行ida远程动态调试,以及对一些简单的汇编指令进行一定的组合判断它是干什么的!

posted @ 2021-03-14 10:09  望权栈  阅读(34)  评论(0编辑  收藏  举报  来源