零碎的东西

r0xy / 2024-11-13 / 原文

函数相关

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)