键盘扫描码
问题来源于逆向题BabyDirver
这道题本来是迷宫问题,判断条件是37,38。这里是键盘扫描码,和ascii码不同。
注意驱动中的编码问题。
参考资料
[1] buuoj-babydriver
[2] 键盘扫描码
二叉树的还原
问题来自于buuoj[2019红帽杯]childRE
二叉树,给定先序和中序遍历,还原过程如下
先序遍历中,根节点总是第一个遍历,找到根节点之后就可以在中序遍历中分开左右子树节点。在左右子树中分别应用这个规律。
给定后续遍历时,根节点总是最后一个被遍历,还原过程和先序遍历类似
MSVC预定义宏
__FUNCDNAME__定义为封闭函数修饰名的字符串文本,这个宏只在函数中定义
1 2 3 4 5 6 7 8 9 10 11 12 13
| void exampleFunction() { printf("Function name: %s\n", __FUNCTION__); printf("Decorated function name: %s\n", __FUNCDNAME__); printf("Function signature: %s\n", __FUNCSIG__);
}
|
可以用UnDecorateSymbolName进行反修饰得到函数签名
修饰名是链接器用于查找方法使用的
参考资料 预定义宏 | Microsoft Docs
修饰名 | Microsoft Docs
bool类型比较和赋值
示例代码
1 2 3 4 5 6
| int main(){ bool a=1; bool b=2; printf("%d\n",a==b); return 0; }
|
汇编代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| .LC0: .string "%d\n" main: push rbp mov rbp, rsp sub rsp, 16 mov BYTE PTR [rbp-1], 1 mov BYTE PTR [rbp-2], 1 movzx eax, BYTE PTR [rbp-1] cmp al, BYTE PTR [rbp-2] sete al movzx eax, al mov esi, eax mov edi, OFFSET FLAT:.LC0 mov eax, 0 call printf mov eax, 0 leave ret
|
可以看到,编译器是通过cmp,setne命令组合赋值的
那如果是变量赋值呢
1 2 3 4 5 6 7 8
| #include <stdio.h> int main(){ bool a=1; int b=2; bool c=b; printf("%d\n",a==c); return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| .LC0: .string "%d\n" main: push rbp mov rbp, rsp sub rsp, 16 mov BYTE PTR [rbp-1], 1 mov DWORD PTR [rbp-8], 2 cmp DWORD PTR [rbp-8], 0 setne al mov BYTE PTR [rbp-9], al movzx eax, BYTE PTR [rbp-1] cmp al, BYTE PTR [rbp-9] sete al movzx eax, al mov esi, eax mov edi, OFFSET FLAT:.LC0 mov eax, 0 call printf mov eax, 0 leave ret
|
MFC程序逆向
出自[HDCTF2019]MFC
可以使用xspy查看程序收到消息的函数,发送消息需要先找到窗体再发送消息
RSA低加密指数攻击和低解密指数攻击
来自rsa2
rsa加密原理:$c=a^e(mod n)$,则$c+i*n=a^e$,如果e和a不太大,则$a^e$也不会太大,此时$i$就不会太大,可以通过穷举$i$然后开方达到解密目的
1 2 3 4 5 6
| import gmpy2 def att(e,n,c,maxi=127): for i in range(maxi): a,ok = gmpy2.iroot(c+i*n) if ok: return a
|
https://github.com/pablocelayes/rsa-wiener-attack