IDA打开 发现是个syscall的题目 直接去看这个函数的汇编 根据师傅们所说,我们需要让rax存入59,让syscall去调用execve函数 (ret2syscall?) syscall_64 GitHub查询 之后要构造出来 execve("/bin/sh",0,0) 拿取权限 找"/bin/sh"字符串 方法一: 在程序中有,找到它 从’[‘数起到斜杠前面的空格’ ',再加上前面的04个字符,一共是22个,换成16进制是16h 所以"/bin/sh"的地址为:0x402016
方法二: 构造ROP链来寻找(这是看官方WriteUp看到的方法 ROPgadget --binary ./main --string '/bin/sh' 找来找去,最后还是要用到csu init函数
text:00000000004011D8 loc_4011D8: ; CODE XREF: init+4C↓j .text:00000000004011D8 mov rdx, r14 .text:00000000004011DB mov rsi, r13 .text:00000000004011DE mov edi, r12d .text:00000000004011E1 call qword ptr [r15+rbx*8] .text:00000000004011E5 add rbx, 1 .text:00000000004011E9 cmp rbp, rbx .text:00000000004011EC jnz short loc_4011D8 .text:00000000004011EE .text:00000000004011EE loc_4011EE: ; CODE XREF: init+31↑j .text:00000000004011EE add rsp, 8 .text:00000000004011F2 pop rbx .text:00000000004011F3 pop rbp .text:00000000004011F4 pop r12 .text:00000000004011F6 pop r13 .text:00000000004011F8 pop r14 .text:00000000004011FA pop r15 .text:00000000004011FC retn .text:00000000004011FC ; } // starts at 4011A0 .text:00000000004011FC init endp .text:00000000004011FC