如何利用程序中存在的printf函数打印从shellcode中得到的pid值?
最近我在做一道缓冲溢出的题目,要求构造输入来打印程序的 pid ,系统环境为 64 位 freebsd。```
Dump of assembler code for function vulnerable:
0x00000000002014b0 <+0>: push %rbp
0x00000000002014b1 <+1>: mov %rsp,%rbp
0x00000000002014b4 <+4>: sub $0x90,%rsp
0x00000000002014bb <+11>: movabs $0x20032b,%rdi
0x00000000002014c5 <+21>: mov $0x0,%al
0x00000000002014c7 <+23>: callq0x201620 <printf@plt>
0x00000000002014cc <+28>: movabs $0x20030a,%rdi
0x00000000002014d6 <+38>: lea -0x80(%rbp),%rsi
0x00000000002014da <+42>: mov %eax,-0x84(%rbp)
0x00000000002014e0 <+48>: mov $0x0,%al
0x00000000002014e2 <+50>: callq0x201630 <scanf@plt>
0x00000000002014e7 <+55>: movabs $0x2002c0,%rdi
0x00000000002014f1 <+65>: lea -0x80(%rbp),%rsi
0x00000000002014f5 <+69>: mov %eax,-0x88(%rbp)
0x00000000002014fb <+75>: mov $0x0,%al
0x00000000002014fd <+77>: callq0x201620 <printf@plt>
0x0000000000201502 <+82>: mov %eax,-0x8c(%rbp)
0x0000000000201508 <+88>: add $0x90,%rsp
0x000000000020150f <+95>: pop %rbp
0x0000000000201510 <+96>: retq
End of assembler dump.
```
根据 gdb 所示,函数 vulnerable 中读取用户输入,并打印。
根据这段代码我测试了一下发现 buffer 长度为 128,rbp 长度为 8,之后再输入 6 位就能修改 RIP 的值。
于是构造汇编
```
section .text
global _start
_start:
;getpid()
xor eax, eax
add al,20
syscall
;exit()
xor eax, eax
add al,1
xor rdi, rdi
syscall
```
在这里我遇到了问题,getpid() 运行完毕后的结果保存在了 rax 寄存器中,我该如何调用原程序中的 printf() 函数来打印这个值呢?
或者还有别的能够将 pid 打印的方法吗?
页:
[1]