零碎的东西
函数相关
64系统调用传参
rax:系统调用号
rdi->rsi->rdx->rcx->r8->r9
函数调用约定
__cdecl:C/C++默认方式,参数从右向左入栈,主调函数负责栈平衡。
stdcall: windows API默认方式,参数从右向左入栈,被调函数负责栈平衡。
fastcall:快速调用方式。所谓快速,这种方式选择将参数优先从寄存器传入(ECX和EDX),剩下的参数再从右向左从栈传入。因为栈是位于内存的区域,而寄存器位于CPU内,故存取方式快于内存,故其名曰“fastcall”。
函数使用
alarm()
unsigned int alarm(unsigned int seconds);
参数
unsigned int seconds
:指定在多少秒后发送SIGALRM
信号。如果参数为 0,则取消任何先前设置的闹钟。
返回值
- 成功时返回先前设置的闹钟剩余的时间(以秒为单位)。
- 如果没有先前设置的闹钟,返回 0。
关于for循环
__int64 sub_B24()
{
int i; // [rsp+0h] [rbp-4h]
for ( i = 0; i <= 19; ++i )
{
if ( !*((_QWORD *)off_202010 + i) )
return (unsigned int)i;
}
return 0xFFFFFFFFLL;
}
这里((_QWORD *)off_202010 + i)
把off_202010强制转化成指向 64 位整型数组的指针,所以这里+i是按照QWORD(八个字节)来移动的。也就是说每次加1实际上是移动8字节
危险函数特点
get()在遇到'\x00'之前不会停止读取
fgets()从stdin读取输入,直到遇到换行符,EOF,或者读取指定大小的字符才会结束读取
python
p64(0),b'\x00'和b'0'的区别
p64(0)
:8 个字节,全部为 0(b'\x00\x00\x00\x00\x00\x00\x00\x00'
)。b'\x00'
:1 个字节,值为 0(b'\x00'
)。b'0'
:1 个字节,值为 48(b'0'
,对应字符 '0')。
关于b''
在recv的时候用recv(b'')
如果里面的字节的值在ASCII码范围之内,会被转化成ASCII码,否则会直接打印出来
b'\x48\x65\x6c\x6c\x6f' # 这个字节串对应的是 'Hello'
b'\xff\xfe' # 这是两个字节,它们的值分别是 255(0xFF)和 254(0xFE)