在x64下有一些万能的gadgets可以利用,例如__libc_csu_init()这个函数。一般来说,只要程序调用了libc.so,程序都会有这个函数用来对libc进行初始化操作。
1.执行gad1
.text:000000000040089A pop rbx 必须为0
.text:000000000040089B pop rbp 必须为1
.text:000000000040089C pop r12 call!!!!
.text:000000000040089E
pop r13 arg3
.text:00000000004008A0
pop r14 arg2
.text:00000000004008A2pop r15 arg1
.text:00000000004008A4 retn ——> to gad2
2.再执行gad2
.text:0000000000400880 mov rdx, r13
.text:0000000000400883 mov rsi, r14
.text:0000000000400886 mov edi, r15d
.text:0000000000400889call qword ptr [r12+rbx*8] call!!! (got表地址!!)
.text:000000000040088D add rbx, 1
.text:0000000000400891 cmp rbx, rbp
.text:0000000000400894 jnz short loc_400880
.text:0000000000400896 add rsp, 8
.text:000000000040089A pop rbx
.text:000000000040089B pop rbp
.text:000000000040089C pop r12
.text:000000000040089E pop r13
.text:00000000004008A0 pop r14
.text:00000000004008A2 pop r15
.text:00000000004008A4 retn ——> 构造一些垫板(7*8=56byte)就返回了