0Nullptr 发表于 2020-1-26 21:28

如何利用程序中存在的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]
查看完整版本: 如何利用程序中存在的printf函数打印从shellcode中得到的pid值?