这是什么妖怪

今天在逆向时进入一个_strlen函数。。

这个循环非常和善,用来确定eax的返回大小,表示字符串长度。

不过问题不在这,似乎我时被迷惑了

这个圈起来的给我看蒙了。这里改变了edx有什么用嘛,在这个函数结束之后,edx又被从栈中返回了,改变了eax,但是下面循环的时候eax也被重新赋值了,这就很迷惑=。=(太菜了)

C语言数字、指针、布尔值灵活利用的典范

先思考这个问题,假设我有一组数,我需要在每两个数字中间加入一个空格然后再输出出来,末尾和头部都没有空格,应该如何实现。

实现方法很简单,加个if就可以实现了,比如我想输出1 2 3 4 5 6,就可以这样:

#include<stdio.h>

int main()
{
	int arr[6] = { 1, 2, 3, 4, 5, 6 };
	for (int i = 0; i < 6; i++)
	{
		if (i == 5) //输出到最后一个数字了
			printf("%d", arr[i]);
		else
			printf("%d ", arr[i]);
	}
	return 0;
}

我们利用一个if语句来判断是否输出到最后一个数字,来选择是否输出占位的空格。事实上,也可以对第一个数字特殊对待,然后剩余数据输出时附带一个空格。

但是如果我们这么做呢:

#include<stdio.h>

int main()
{
	int arr[6] = { 1, 2, 3, 4, 5, 6 };
	for (int i = 0; i < 6; i++)
		printf(" %d" + !i, arr[i]);
	return 0;
}

极其简单的几句话完成了我们之前要的操作,一气呵成。

我详细叙述下它的过程:

玄机在于printf语句的那个加法上。C语言的字符串常量作参数,实际上是一个指向常量池中该字符串的指针,也就是可以进行运算。然后就是一个!i,这是把C语言中的整型数据当布尔值来看待,对他取非。当循环第一趟时,i=0,0在C语言中是false,非i得到true,默认为1,当那个指针+1,指针就从原来的指向空格,变成指向“%d”,那么就不会输出空格。而当之后几轮时,i均为非0数,C语言中为true,那么取非则得到false,即0,那么原指针+0,就是它本身,也就会正常输出空格,最后达到我们的要求。

这种写法说实话有很大局限性,可读性也极差,但是却很好的体现了C语言的灵活之处。C语言对数据和内存的操作极为灵活,这就要求使用者有很高的水平。这种写法不推荐在正式的程序设计中使用,但是对于开拓思维、优化程序是很有帮助的。

kali子系统启用root用户骚操作

kali平时使用大家都是直接用root用户,省(tou)事(lan)。

安装Windows的子系统的时候,kali会默认要求你创建新管理员用户,到时候再去删掉这个用户再启用root用户太麻烦了。

其实只要在第一次安装提示创建新用户的时候,直接关掉wsl再重新打开,你就会发现你直接使用默认的root用户登录了,非常偷懒。

LinkStart

到学校得路上贼坎坷,办好了麻烦事就可以开始啦*-*。

菱形继承虚表 看着好晕(等我看一遍C++再看吗。。)

买了本Windows程序设计,没想到是C#和XMHL相关,虽然似乎对学win32 API很有帮助就是,还有C++的面向对象的东西要看看。一下子就多了好多任务的亚子ToT。

question

计算机编码的奇迹 补码

给两个条件
当前补码+1等于下一个补码(比如【1】+1=【2】)
互为相反数的补码相加为【0】(比如【1】+【-1】=【0】)

产生的编码是唯一的嘛(充分必要嘛)

逆向之花指令-1

13届大学甚竞赛遇到一道题目,名字叫做hyperthreading,看着很懵逼,还找了资料发现有什么多线程泄露内存什么的,导致我当场宕机

后来看了别人的wp,知道了这是考一个花指令的东西,然后钻研了一段时间搞明白了些。

花指令目的是为了让反编译器不能识别汇编指令,由于反汇编器有两种解析模式,第一种线性的,比如OD,这个只要jmp或者call到一个解析地址的中间段,OD就解析不出来了。还有一种是探测性质的,以指令来进行一步一步的解析,但是并没有实质的运行。只要产生逻辑的问题,反汇编器也就解析不出来,IDA类型的,x32dbg好像也是这样

说这么多,直接上题目

查找字符串很快就能找到主函数,连续三个创建线程的函数。

继续跟踪线程的地址

我们直接手动改代码,把jmp指令nop掉,或者在别的地方修改一下。

然后继续,发现一个最恶心的地方,这地方没改好IDA也能大致反编译出C语言,题目hi能做了,但是还是会搞不清楚。

直接魔改汇编,把jnz call retn全部nop掉(省事又省力)

然后再拖到IDA里面看看,发现出来一个加密函数。
打算直接看汇编对照一下,一个能有一些收获,这个代码是真滴奇葩,第一个线程根本不能好好工作,其实有违花指令的目的的。

突然有一个想法,把所有的运行的步骤复制一遍到新的PE文件中,然后以不会产生花指令的模式修改jmp call 等指令跳转的地方,然后再用IDA识别。
下次可以试试。才疏学浅,俺就先分析到这了。

Win主机IDA调试虚拟机ubuntu

本来按照教材什么的应该很方便得,但是到我这就出现一堆问题,也算是有了新的认识了,下面我来唠嗑一下。

为了remote调试ELF文件,首先要在客户机(ubuntu)上放上IDA安装目录的linux_server和linux_server64,然后给这俩货加可执行权限。

IDA->Debugger->run->Remote Linux Debugger

Application:[可执行文件的位置]
Directory:[可执行文件的存放目录]
Parameters:[不知道啥用,不用写]
Hostname:[客户机地址]
Password:[密码]

关键就是在这个客户机地址上,虚拟机ip地址对于主机到底是多少呢,使用ifconfig得到172.17.0.1,这个网段就有点奇怪了,在网上找了一下,发现有人说dokcer设置的什么默认地址,无法操作服务器
https://blog.csdn.net/Dawn__Z/article/details/84746055
这里贴一个网址(不清楚有没有用)

接着寻找,想起了之前ifconfig的时候,那个网卡叫做docker0,我只用了虚拟机呀,和docker啥关系呀,然后我把网络地址转换[NAT]换成了桥接网卡,在ifconfig,这下终于出来192….了,啊这,有大佬能告诉我为什么吗ToT。

给虚拟机(Vbox)扩扩容

最近ubuntu总是开不起来,发现挂载都要满了,还剩几百兆的容量,想起我之前是相当抠门,只给了它10GB,杂七杂八的包,系统什么东东搞了,还能剩下啥。
不说了,来挽救一下。

Vbox安装目录下有 VBoxManage.exe 这个大有用处
https://www.cnblogs.com/luhouxiang/p/3275102.html
(附了一个关于VBoxManage的命令行使用的东东)

VBoxManage.exe modifyhd "%UserProfile%\VirtualBox VMs\<VM name>\<VM name>.vdi" --resize 20480

resize表示重新定义吧,大小20GB,弄完在Vbox上没发现什么变化,打开虚拟机看看,也还是10GB???
https://superuser.com/questions/1302973/used-vboxmanage-modifyhd-resize-actual-size-did-not-change
看了这个稍微有点启发,直接干,不管那么多,于是再查查怎么在ubuntu里面扩容,一个挺好用的软件gparted

sudo apt intall gparted

安装完成之后直接在终端输入gparted就可以开始啦

另外想起gparted也可以设置很多别的东东,算是相当不错的软件了,码了码了。