0%

比赛细节注意点

pwn_细节

partial write

保护全开情况下考虑部分覆盖,不要全部覆盖,开了pie后三位是固定的

巧妙利用unsortbin可以在malloc_hook或者free_hook前伪造一个地址,造成错位攻击

aslr跟pie区别

aslr是系统级别的,如果系统级别没有aslr,pie保护也没什么用
pie只是使得编译后的程序支持aslr,不支持的话就不会随机

rop跟jmp esp区别

rop通常给的是地址,也就是已存在的,通过这个地址的代码组合起来执行
而jmp esp是直接执行esp处代码

shellcode

0xE8 CALL 后面的四个字节是地址

0xE9 JMP 后面的四个字节是偏移

0xEB JMP 后面的二个字节是偏移

0xFF15 CALL 后面的四个字节是存放地址的地址

0xFF25 JMP 后面的四个字节是存放地址的地址

0x68 PUSH 后面的四个字节入栈

0x6A PUSH 后面的一个字节入栈

可显示字符汇编

1.数据传送:
push/pop eax…
pusha/popa

2.算术运算:
inc/dec eax…
sub al, 立即数
sub byte ptr [eax… + 立即数], al dl…
sub byte ptr [eax… + 立即数], ah dh…
sub dword ptr [eax… + 立即数], esi edi
sub word ptr [eax… + 立即数], si di
sub al dl…, byte ptr [eax… + 立即数]
sub ah dh…, byte ptr [eax… + 立即数]
sub esi edi, dword ptr [eax… + 立即数]
sub si di, word ptr [eax… + 立即数]

3.逻辑运算:
and al, 立即数
and dword ptr [eax… + 立即数], esi edi
and word ptr [eax… + 立即数], si di
and ah dh…, byte ptr [ecx edx… + 立即数]
and esi edi, dword ptr [eax… + 立即数]
and si di, word ptr [eax… + 立即数]

xor al, 立即数
xor byte ptr [eax… + 立即数], al dl…
xor byte ptr [eax… + 立即数], ah dh…
xor dword ptr [eax… + 立即数], esi edi
xor word ptr [eax… + 立即数], si di
xor al dl…, byte ptr [eax… + 立即数]
xor ah dh…, byte ptr [eax… + 立即数]
xor esi edi, dword ptr [eax… + 立即数]
xor si di, word ptr [eax… + 立即数]

4.比较指令:
cmp al, 立即数
cmp byte ptr [eax… + 立即数], al dl…
cmp byte ptr [eax… + 立即数], ah dh…
cmp dword ptr [eax… + 立即数], esi edi
cmp word ptr [eax… + 立即数], si di
cmp al dl…, byte ptr [eax… + 立即数]
cmp ah dh…, byte ptr [eax… + 立即数]
cmp esi edi, dword ptr [eax… + 立即数]
cmp si di, word ptr [eax… + 立即数]

5.转移指令:
push 56h
pop eax
cmp al, 43h
jnz lable

<=> jmp lable

6.交换al, ah
push eax
xor ah, byte ptr [esp] // ah ^= al
xor byte ptr [esp], ah // al ^= ah
xor ah, byte ptr [esp] // ah ^= al
pop eax

7.清零:
push 44h
pop eax
sub al, 44h ; eax = 0

push esi
push esp
pop eax
xor [eax], esi ; esi = 0

当然,上面汇编指令中的立即数大小也需要在可打印字符范围内。

汇编指令机器码

一、汇编速查
MOV AA,BB 将 BB 放到 AA 里
CALL 调用子程序 (相当于 BASIC 的 GOSUB)
RET 与 RETF 返回程序 (相当于 BASIC 的 RETURN)
CMP XX,YY 比较 XX 与 YY
JZ 若相等则转移
JNZ 若不相等则转移
JB 若小于则转移
JG 若大于则转移
JMP 无条件转移
J??? (各种转移指令)
LOOP 循环直到CX为0
INT XX 类似 CALL 的中断涵数
PUSH 推入栈(STACK)ESP:PUSH AX
POP 出栈ESP:POP CX
XCHG 交换ESP:XCHG AX,BX
IN、OUT 与PORT有关的IN/OUT
XLAT 查表
LEA 段内偏移量。ESP:LEA AX,AREA1=MOV AX,OFFSET AREA1
LAHF、SAHF与棋标有关的寄存器 AH
PUSHF、POPF将棋标入/出栈
ADD ESP ADD AX,CX (AX=AX+CX)
ADC 加入棋标C的ADD
INC ESP INC AX(AX=AX+1)
AAA 加法校正
SUB、SBB 减法
DEC ESP: DEC AX(AX=AX-1)
NEG 去补,
MUL、IMUL 乘
DIV、IDIV 除
SHR、SAR、SHL 算术、逻辑位移R=RIGHT L=LEFT
OR、XOR、AND 逻辑运算 ESP :XOR AX,AX(AX=0)

直接标志转移
指令格式 机器码 测试条件 如…则转移
JC 72 C=1 有进位
JNS 79 S=0 正号
JNC 73 C=0 无进位
JO 70 O=1 有溢出
JZ/JE 74 Z=1 零/等于
JNO 71 O=0 无溢出
JNZ/JNE 75 Z=0 不为零/不等于
JP/JPE 7A P=1 奇偶位为偶
JS 78 S=1 负号
JNP/IPO 7B P=0 奇偶位为奇

间接标志转移
指令格式 机器码 测试格式 如…则转移
JA/JNBE(比较无符号数) 77 C或Z=0 > 高于/不低于或等于
JAE/JNB(比较无符号数) 73 C=0 >= 高于或等于/不低于
JB/JNAE(比较无符号数) 72 C=1 < 低于/不高于或等于
JBE/JNA(比较无符号数) 76 C或Z=1 <= 低于或等于/不高于
JG/JNLE(比较带符号数) 7F (S异或O)或Z=0 > 大于/不小于或等于
JGE/JNL(比较带符号数) 7D S异或O=0 >= 大于或等于/不小于
JL/JNGE(比较带符号数) 7C S异或O=1 < 小于/不大于或等于
JLE/JNG(比较带符号数) 7E (S异或O)或Z=1 <= 小于或等于/不大于
无条件转移指令JMP
指令格式 执行操作 机器码 说明
段内直接短转移Jmp short (IP)←(IP)+8位位移量 EB 转移范围-128到+127字节
段内直接近转移Jmp near (IP)←(IP)+16位位移量 E9 转移到段内的任一位置
段内间接转移Jmp word (IP)←(有效地址EA) FF
段间直接(远)转移Jmp far (IP)←(偏移地址)
(CS)←(段地址) EA
段间间接转移 Jmp dword (IP)←(EA)
(CS)←(EA+2)

gdb 命令

1
2
3
4
display /3i addr   #显示地址处汇编
disassemble /r main #可显示主函数处机器码
disas /m fun #(disas是disassemble命令缩写)命令将函数代码和汇编指令映射起来
b *func #断在指定函数处开头,已经进入

scanf截断

scanf遇到\x20,\x09, \x0a, \x0b, \x0c, \x0d 会截断,也就是无法继续输入

scanf绕过

可以输入-,+,不往指定地址写内容,但是可以绕过输入

没头绪时候考虑下写fini

.fini_array
这是结束的时候会调用的,只能执行一次

exit_hook

偷家小技巧

本文作者:NoOne
本文地址https://noonegroup.xyz/posts/c85295da/
版权声明:转载请注明出处!