关于学pwn的汇编基础,其实我之前汇编基础不是很好,勉强能读懂一点,很多时候还是很乱,在这里分享一下我的学习方法吧
IDA逆向分析出的源码
1 | setvbuf(stdout, 0, 2, 0); |
汇编代码:
1 | 80484f9: 83 ec 34 sub $0x34,%esp |
pwn的主要工作是在Linux上完成的,但是我们又要用在IDA,又要在Linux下调试,来回切换很麻烦,所以,你要是能读懂汇编,那问题就简单了,直接objdump -a,看一下汇编,OK
回正题
观察上面我给的图,我画线链接的就是汇编与源码
拿第一句setvbuf(stdout,0,2,0);
来说,不难看出
setvbuf函数的三个参数分别是stdout,0,2,0
栈是先进后出的,所以,会先push第四个参数(0)到stack上,依次是第三个(2),第二个(0),第一个(stdout)
对应的汇编代码是:
1 | 80484f9: 83 ec 34 sub $0x34,%esp #在栈上开出一个大小为0x34的空间 |
IDA的分析:
1 | .text:080484FC ; 5: setvbuf(stdout, 0, 2, 0); |
每一次写题目都这样对照,你的读汇编能力就很快得到提升
这里注意的是,x86的传参是直接把参数push到stack上然后call函数,但是x64却不是,x64 的传参是
当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9
参数个数大于 7 个的时候(拿F函数来举例)
F(a, b, c, d, e, f, g, h);
a->%rdi, b->%rsi, c->%rdx, d->%rcx, e->%r8, f->%r9
h->8(%esp)
g->(%esp)
call F