# 1.vmmap 有时没有显示正常的执行权限

ctfshow (pwn60) ubuntu22.04pwndbg 和 ida 显示 bss 没有执行权限,而再 ubuntu18.03 则可以看到 bss 段有执行权限

# 2.leave 指令对栈有影响

ctfshow(pwn61)

leave 指令相当于 mov rsp rbp; pop rbp 将栈顶拉下来和栈顶指向同一位置( 地址 ),那么相当于栈被重置了(栈空间被重置了),这样导致我们在栈空间写入的 有效数据 会被清空(例如 shellcode), padding 一般没有影响,所以要避开这个栈空间内部写入 有效数据

可以通过栈溢出来写入 shellcode 在栈的外面,这样就可以有效

在 pwn69,用 p64(jmp_rsp) 覆盖了 ret,但是后面仍然要写 asm("sub rsp,0x30; jmp rsp") 应该也与这个有关:

payload=p64(jmp_rsp)+asm("sub rsp,0x30; jmp rsp")

# 3.printf (% p,) 和 printf (% s) 打印地址

%p:

利用 addr=int(p.recv(10),16) , 后面发送也不会有类型错误

%s:

利用 addr=u32(p.recv(4)) , 后面发送也不会有类型错误

# 4.mmap 开辟空间的权限

mmap 开辟空间权限可以执行对应权限的命令,如 6(读写)就可以执行 orw 命令

# 5. 函数需要返回地址和不需要返回地址的区分

我们在用 ret 覆盖时,如果是用 plt 表的地址覆盖,就需要返回地址,因此在限制了字节数时,不能调用 plt 因为 plt 需要返回值,但如果程序中有现成的 call 函数(如 system(echo 'ok')有 call system,需要参数)就可以不用返回值了,因为它会自己把下一条指令给压进去(这里直接用 call system 的地址即可)

# 6. 可以利用 ROPgadget 来查找 'sh' 字符串

ROPgadget --binary wustctf2020_getshell_2 --string 'sh'

# 7.ida 的距离 ebp 偏移有时不准

最好函数利用 gdb 调试

# 8. 连续进行系统调用时,要 int 0x80;ret

必须要有这个 ret,不然无法跳转去执行后面的系统调用

ROPgadget 找到的都以 int 0x80 结尾,后面没有 ret,在 ida 里 ALT + T 搜索 text int 80h , 保持中间的间距才能搜索到

# 9. 需要泄露地址时,可以看看 printfputs 是否可以泄露(ciscn_2019_s_4)

只能溢出几个字节时,可以尝试将 ebp 前面的填满,然后顺带将 ebp 打印出来,只不过打印的 ebp 地址是 mian 函数的,然后计算输入的地址与 ebp 的偏移(gdb 查看 read 参数的 buf 地址)

# 10 大端序与小端序

# 小端序

小端序低位字节在低地址,高位字节在高地址(常用于 x86 系列 CPU)

显示的地址内容:

0x00000000:78 56 34 12  这里就是低地址->高地址
0x78的地址为0x0000,0x56地址为0x00001....

但是在字符数组里无论是 大端还是小端序都相同

0x12345678 会被视为分开的元素 0x12 0x34 0x56 0x78 ,此时 0x12 本身就是一个字节不分高低了直接填入,然后填入 0x34 .. 0x56 .. 0x78

显示的地址内容:

0x00000000:12 34 56 78 这里就是低地址->高地址
0x12的地址为0x0000,0x34地址为0x00001....

字符串也是同理(字符数组)

# 大端序

大端序是高位字节在低地址,低位字节在高地址(网络协议往往采用大端序所以也叫网络字节序,PowerPC 也通常采用大端序)

http://t.csdnimg.cn/jGs0q

此文章已被阅读次数:正在加载...更新于