system中的小要求
把libc文件在IDA中显示
但不同libc文件可能不会存在这个问题
__int64 __fastcall system(__int64 a1)
{
if ( a1 )
return sub_44E20(a1);
else
return (unsigned int)sub_44E20((__int64)"exit 0") == 0;
}
对应汇编形式
.text:0000000000045390 ; __unwind {
.text:0000000000045390 test rdi, rdi test是与操作,即参数非0即可执行参数对应命令
.text:0000000000045393 jz short loc_453A0
.text:0000000000045395 jmp sub_44E20
.text:0000000000045395 ; ---------------------------------------------------------------------------
.text:000000000004539A align 20h
.text:00000000000453A0
.text:00000000000453A0 loc_453A0: ; CODE XREF: system+3↑j
.text:00000000000453A0 lea rdi, aExit0 ; "exit 0" 如果参数为0会执行 exit 0命令
.text:00000000000453A7 sub rsp, 8
.text:00000000000453AB call sub_44E20
.text:00000000000453B0 test eax, eax
.text:00000000000453B2 setz al
.text:00000000000453B5 add rsp, 8
.text:00000000000453B9 movzx eax, al
.text:00000000000453BC retn
.text:00000000000453BC ; } // starts at 45390
.text:00000000000453BC system endp
打开其中的sub_44E20
.text:0000000000044E20 ; __unwind {
.text:0000000000044E20 push r12
.text:0000000000044E22 push rbp
.text:0000000000044E23 xor eax, eax
.text:0000000000044E25 push rbx
.text:0000000000044E26 mov ecx, 10h
.text:0000000000044E2B mov rbx, rdi
.text:0000000000044E2E mov esi, 1
.text:0000000000044E33 sub rsp, 170h
.text:0000000000044E3A lea rbp, [rsp+188h+var_B8]
.text:0000000000044E42 mov [rsp+188h+var_B8], 1
.text:0000000000044E4E mov [rsp+188h+var_30], 0
.text:0000000000044E59 lea rdx, [rbp+8]
.text:0000000000044E5D mov rdi, rdx
.text:0000000000044E60 rep stosq
.text:0000000000044E63 cmp cs:dword_3C9740, 0
.text:0000000000044E6A jz short loc_44E78
.text:0000000000044E6C lock cmpxchg cs:dword_3C64A0, esi
.text:0000000000044E74 jnz short loc_44E81
.text:0000000000044E76 jmp short loc_44E9B
.text:0000000000044E78 ; ---------------------------------------------------------------------------
.text:0000000000044E78
.text:0000000000044E78 loc_44E78: ; CODE XREF: sub_44E20+4A↑j
.text:0000000000044E78 cmpxchg cs:dword_3C64A0, esi
.text:0000000000044E7F jz short loc_44E9B
.text:0000000000044E81
.text:0000000000044E81 loc_44E81: ; CODE XREF: sub_44E20+54↑j
.text:0000000000044E81 lea rdi, dword_3C64A0
.text:0000000000044E88 sub rsp, 80h
………………………………………………下面还有很多在这里就不显示了
大佬说这个函数的末尾有movaps指令为
movaps[rsp+198h+var_158],xmmo
(我们可以直接在IDA中的system区域搜索该指令是否存在)
这个指令要求 rsp+198h+var_158的值的十六进制形式为0x10的整数倍,否则无法getshell
方法:
1.改变payload长度,(局部变量入栈,栈长度改变)使得rsp值改变
2.利用ret使得rsp+1
3.使用其他gadget从而影响rsp
4.栈转移 当playload长度有限制,然后继续尝试该变rsp的方法
5.调用execve这个要三个参数要求较高