# 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. 需要泄露地址时,可以看看 printf
和 puts
是否可以泄露(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