反调试技术_各种标志
反调试技术(1)_各种标志总之就是记录各种用于防止反调试的字段,感觉没啥用。
参考、摘抄自:https://ctf-wiki.org/reverse/windows/anti-debug
NtGlobalFlag概念解释在 32 位机器上, NtGlobalFlag字段位于PEB(进程环境块)0x68的偏移处, 64 位机器则是在偏移0xBC位置. 该字段的默认值为 0,当调试器运行时,该字段有时会被更改(不一定)。
123FLG_HEAP_ENABLE_TAIL_CHECK (0x10)FLG_HEAP_ENABLE_FREE_CHECK (0x20)FLG_HEAP_VALIDATE_PARAMETERS (0x40)
程序中可能会对该字段进行检测,若不为00就直接跳转到being_debugged
注:NtGlobalFlag的那 3 个标志位只有当程序是由调试器创建, 而非由调试器附加上去的进程时, 才会被设置.
检测方式 (32位)注:fs寄存器指向当前活动线程的TEB
12345mov eax, fs:[30h] ;Process Environment Bloc ...
huawei系统软件卸载
huawei系统软件卸载参考,摘抄自:http://www.usbmi.com/5700.html
正常操作的情况下,安卓手机的控制只需要单用户即可,因此卸载用户目录下的软件即可,不需要从系统目录连根拔起斩尽杀绝(这样刷机的时候还能恢复)
第一步:
手机的”设置”—“系统”—“开发人员选项”,界面下滑找到”调试”,打开“USB调试”、“连接USB时总是弹出提示”“监控ADB安装应用”、“仅充电模式下允许USB调试”这四个选项,有些不让选也影响不大。
第二步:
电脑下载调试工具包 ADB Kits
数据线连接电脑和手机,连接后在手机选择仅充电
手机还会有一条连接确认,确认即可。
第三步:
adb命令(做打码处理):
123C:\Users\xxx\Desktop\Andriod\adb>adb devicesList of devices attachedKWG5Txxxxxx07xx5 device
说明已经连接了设备,下面就可以操作了
第四步:
1234获取系统当前用户的安装列表:adb shell pm list packages >alist.t ...
机器码总结
机器码总结摘抄自:https://www.cnblogs.com/liushuijinger/archive/2012/04/05/2433718.html
原码:
如果机器字长为n,那么一个数的原码就是用一个n位的二进制数,其中最高位为符号位:正数为0,负数为1。剩下的n-1位表示概数的绝对值。
例如: X=+101011 , [X]原= 00101011 X=-101011 , [X]原= 10101011
位数不够的用0补全。
PS:正数的原、反、补码都一样。
反码:
知道了什么是原码,那反码就更是张飞吃豆芽——小菜一碟了。知道了原码,那么你只需要具备区分0跟1的能力就可以轻松求出反码,为什么呢?因为反码就是在原码的基础上,符号位不变其他位按位取反(就是0变1,1变0)就可以了。
例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100
补码:
补码也非常的简单就是在反码的基础上按照正常的加法运算加1。
例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]补=11010101
移码:
移码最简单了, ...
浮点数的表示
浮点数的表示c语言中的浮点数:float , double , long double
首先,为什么要使用浮点方法,为什么要使用浮点数而不使用定长小数。
这是因为如果小数定长,其精度就是固定的,也就是说,这样的表示方法就会有固定长度的整数位和小数位。一般这些位数都不会被全部用到,甚至很有可能牺牲精度,或者造成空间浪费,因此,需要创造一种小数点可以移动的数字表示方法,即浮点数。
其次,如何科学的表示二进制数。
这里引入二进制的科学计数法:十进制有科学计数法,任何十进制数都可以表示为x.xxxx*10^n(x为0-9),同理,所有二进制数也可以表示为1.xxx*2^n(x为0-1),举个例子:
12101101.11101101转化为科学计数法1.0110111101101*2^5
那么按照这样的思路,一个二进制数,就能表示为一个整数位定长为1,且一定是1的数字1.0110111101101(因为整数位永远是1,因此其实可以默认),和另一个整数5,代表乘2的多少次方。
然后,再加入正负的可能性,我们就可以完全的表示一个二进制数。**
123456N=((-1)^S)*(R^E)*M其中N ...
writeup_intOverflow_pwn
writeup_intOverflow_pwn
先小查一下,开启了堆栈不可执行,放ida吧
逻辑很清楚,进login
username:0x19pw:0x199
好长的密码
密码的长度为3-8则输出错误,否则正确。
那么首先要找溢出点,在login函数中,空间给的很大,而且read()函数限制严格,不可能溢出。
然后来到check函数中,一开始对密码的长度做了校验,然后把校验长度之后的密码通过strcpy放入dest中,这里dest的大小很小:
如果能跳过校验,我们就可以覆盖掉返回地址,然后调用what_is_this函数:
那么如何绕过校验,让strcpy执行,复制足够长的字符串呢?这就需要整数溢出
Int8, 等于Byte, 占1个字节.
可以看到int8非常的小,最大就是255, 如果存入int8的值比255还大,就会循环溢出。
因此
password字符串的长度可以是3-8个字符,也可以是259-264个字符
就靠这个原理就可以构造shellcode了,如下:
123456789101112131415161718from pwn import *p=r ...
writeup_guessNum_pwn
writeup_guessNum_pwn咱就是说,还得会c语言我是没想到的,枯了
先check一下:
好家伙,一片绿,哈人,没法覆盖返回地址了。
先扔ida:
循环产生随机数,然后猜数字,v7似乎可以做一个溢出
然后就需要一点点c语言知识,在上面的区域中,seed变量的值是可以覆盖的,而seed是什么呢?
在使用rand()函数时,首先需要使用srand设定一个seed,只有随机生成了seed每一次rand()顺序生成的数列才是不同的,若seed相同时,生成的随机数列也是相同的。
我不信,小试一下:
我信了。。。
按照逆向的思路,我们可以看看随机的seed是如何生成的,进入sub_BB0函数:
果然不是逆向,是在本地文件中读取的,那没事了。
所以只要覆盖seed,并且用seed在本地生成随机数,然后再传过去就可以了,创作一个脚本:
顺便学一下python中调用c语言。
cyberpeace{5df2a9bab4fa085d9359d4c9722f857c}
Canery(金丝雀)的介绍与绕过
Canery(金丝雀)的介绍与绕过摘抄文献 :https://blog.csdn.net/weixin_43713800/article/details/105273284
Canary 的意思是金丝雀,来源于英国矿井工人用来探查井下气体是否有毒的金丝雀笼子。工人们每次下井都会带上一只金丝雀。如果井下的气体有毒,金丝雀由于对毒性敏感就会停止鸣叫甚至死亡,从而使工人们得到预警。
当我们使用栈溢出进行攻击,或者覆盖返回地址时,会覆盖掉源数据。金丝雀机制就是在栈底插入cookie验证信息,如果cookie被覆盖就会验证失败。
Canary 与 Windows 下的 GS 保护都是缓解栈溢出攻击的有效手段。
Canary的使用(gcc)可以在 GCC 中使用以下参数设置 Canary:
-fstack-protector 启用保护,不过只为局部变量中含有数组的函数插入保护-fstack-protector-all 启用保护,为所有函数插入保护-fstack-protector-strong-fstack-protector-explicit 只对有明确 stack_protect attr ...
writeup-CGfsb-pwn
writeup-CGfsb-pwn麻了,pwn好难哈哈哈哈哈哈
本题目是利用字符串格式化漏洞来更改pwnme变量的值。
先看看pwnme变量存在哪了?
简单地说,就是一个会自动初始化为0的可读写区段。
那么,到底什么是字符串格式化漏洞?
printf函数含有的参数构造是由一个固定的format字符串和多个输出表列组成的,他们在函数调用时被一起推入内存,当我们在format字符串中形如填了%啥的东西后,他就会自动在内存中寻找参数(也就是我们推入的输出表项);
在printf函数中,有一个带有赋值功能的格式化字符串是%n,其功能就是记录在%n之前输出的字符数,然后将此值赋给一个变量。那赋值给哪一个变量呢?我们就需要传入这个变量的指针,也就是使用&变量名来接收参数,即类似于下图中的语法:
这样一来,我们就可以利用printf进行赋值了。
那么,我们要赋值给pwnme这个变量,要怎么做呢。
我们只能传入一个参数,因此需要手动设定在format字符串中%n这个赋值操作的偏移量,他并不是直接指向下一个地址,而是指向了某一个存了目标(即pwnme)变量的指针的地址,那么这个指针肯定也 ...
汇编函数调用的传参规则
汇编函数调用的传参规则0x01 一般流程函数调用一般有个模板。
123456789101112131415161718192021222324push esmov ebp,esp//这里提升堆栈sub esp,0x40 //这里是开辟缓冲区,不同编译器开辟的缓冲区大小不同。push edipush esipush ebx//保留现场lea edi, dword ptr ss:[ebp-0x40]mov ecx,0x10mov eax,0xccccccccrep stos dowrd ptr es:[edi]//填充缓冲区--------------------------------------------------------//这里是写函数的功能--------------------------------------------------------pop ebxpop esipop edi//恢复现场mov esp,ebppop ebpret
中间的ccc…就是填充缓冲区。填充后可以用来写入局部变量。EBP后面的高址,存有恢复用的EIP,和call函数前push的参 ...
writeup_babyXOR_reverse
writeup_babyXOR_reverse有不知名壳,esp定律手动脱
放进ida,好家伙,七百个函数,离大谱
先看看main函数里有啥,发现花里胡哨,查教程,麻烦的离谱,果断动调看看。
上为输入函数,随便输入了一串字符
运行到此处发现:
阿哲?
行8
flag{2378b077-7d6e-4564-bdca-7eec8eede9a2}