buuoj中学到的东西

键盘扫描码

问题来源于逆向题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
// Demonstrates functionality of __FUNCTION__, __FUNCDNAME__, and __FUNCSIG__ macros
void exampleFunction()
{
printf("Function name: %s\n", __FUNCTION__);
printf("Decorated function name: %s\n", __FUNCDNAME__);
printf("Function signature: %s\n", __FUNCSIG__);

// Sample Output
// -------------------------------------------------
// Function name: exampleFunction
// Decorated function name: ?exampleFunction@@YAXXZ
// Function signature: void __cdecl exampleFunction(void)
}

可以用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); // 1
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查看程序收到消息的函数,发送消息需要先找到窗体再发送消息

1

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