C 为什么没有';t printf打印出缓冲区溢出中的字符串?

C 为什么没有';t printf打印出缓冲区溢出中的字符串?,c,assembly,x86-64,buffer-overflow,C,Assembly,X86 64,Buffer Overflow,我正在学习缓冲区溢出。我写了一个小C程序: #include<stdio.h> #include<string.h> void vuln(); void win(); void main(int argc, char *argv[]){ vuln(); } void win (){ printf("Pwned!!"); } void vuln(){ char buffer[256]; printf("Ent

我正在学习缓冲区溢出。我写了一个小C程序:

#include<stdio.h>
#include<string.h>
void vuln();
void win();
void main(int argc, char *argv[]){
        vuln();

}
void win (){
        printf("Pwned!!");
}
void vuln(){
        char buffer[256];
        printf("Enter a string: ");
        scanf(" %s", buffer);
}
我通过使用有效负载成功跳转到
win

>>> payload = "A"264 + p64(0x0000555555555161)
问题是它没有打印出函数
win
中的字符串。我得到的只是分割错误。以下是我得到的:

Program received signal SIGSEGV, Segmentation fault.
0x00007fffffffe158 in ?? ()
[ Legend: Modified register | Code | Heap | Stack | String ]
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── registers ────
$rax   : 0x7               
$rbx   : 0x0               
$rcx   : 0x0               
$rdx   : 0x0               
$rsp   : 0x00007fffffffe068  →  0x0000000200000000
$rbp   : 0x4141414141414141 ("AAAAAAAA"?)
$rsi   : 0x656e7750        
$rdi   : 0x00005555555592a0  →  "Pwned!! string: "
$rip   : 0x00007fffffffe158  →  0x00007fffffffe436  →  "/media/sf_Code/asm/vuln"
$r8    : 0x00007ffff7fb9500  →  0x00007ffff7fb9500  →  [loop detected]
$r9    : 0x7               
$r10   : 0x0000555555556004  →  0x00212164656e7750 ("Pwned!!"?)
$r11   : 0x246             
$r12   : 0x0000555555555060  →  <_start+0> xor ebp, ebp
$r13   : 0x00007fffffffe150  →  0x0000000000000002
$r14   : 0x0               
$r15   : 0x0               
$eflags: [zero carry PARITY ADJUST sign trap INTERRUPT direction overflow RESUME virtualx86 identification]
$cs: 0x0033 $ss: 0x002b $ds: 0x0000 $es: 0x0000 $fs: 0x0000 $gs: 0x0000 
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── stack ────
0x00007fffffffe068│+0x0000: 0x0000000200000000   ← $rsp
0x00007fffffffe070│+0x0008: 0x00005555555551c0  →  <__libc_csu_init+0> push r15
0x00007fffffffe078│+0x0010: 0x00007ffff7e1ebbb  →  <__libc_start_main+235> mov edi, eax
0x00007fffffffe080│+0x0018: 0x0000000000000000
0x00007fffffffe088│+0x0020: 0x00007fffffffe158  →  0x00007fffffffe436  →  "/media/sf_Code/asm/vuln"
0x00007fffffffe090│+0x0028: 0x0000000200100000
0x00007fffffffe098│+0x0030: 0x0000555555555145  →  <main+0> push rbp
0x00007fffffffe0a0│+0x0038: 0x0000000000000000
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── code:x86:64 ────
   0x7fffffffe152                  add    BYTE PTR [rax], al
   0x7fffffffe154                  add    BYTE PTR [rax], al
   0x7fffffffe156                  add    BYTE PTR [rax], al
 → 0x7fffffffe158                  ss     in  al, 0xff
   0x7fffffffe15b                  (bad)  
   0x7fffffffe15c                  (bad)  
   0x7fffffffe15d                  jg     0x7fffffffe15f
   0x7fffffffe15f                  add    BYTE PTR [rsi-0x1c], cl
   0x7fffffffe162                  (bad)  
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── threads ────
[#0] Id 1, Name: "vuln", stopped 0x7fffffffe158 in ?? (), reason: SIGSEGV
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── trace ────
[#0] 0x7fffffffe158 → ss in  al, 0xff
程序接收信号SIGSEGV,分段故障。
0x00007FFFFFE158英寸??()
[图例:修改的寄存器|代码|堆|堆栈|字符串]
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 登记册────
$rax:0x7
$rbx:0x0
$rcx:0x0
$rdx:0x0
$rsp:0x00007FFFFFE068→  0x00000002000000000
$rbp:0x4141(“AAAAAAAA”?)
$rsi:0x656e7750
$rdi:0x00005592a0→  “Pwned!!字符串:”
$rip:0x00007FFFFFE158→  0x00007FFFFFE436→  “/media/sf_Code/asm/vuln”
$r8:0x00007ffff7fb9500→  0x00007ffff7fb9500→  [检测到循环]
$r9:0x7
$r10:0x00005556004→  0x00212164656e7750(“Pwned!!”?)
$r11:0x246
$r12:0x00005555060→   异或ebp,ebp
$r13:0x00007FFFFFE150→  0x0000000000000002
$r14:0x0
$r15:0x0
$eflags:[零进位奇偶校验调整符号陷阱中断方向溢出恢复virtualx86标识]
$cs:0x0033$ss:0x002b$ds:0x0000$es:0x0000$fs:0x0000$gs:0x0000
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 堆栈────
0x00007FFFFFE068│+0x0000:0x00000002000000000← $rsp
0x00007FFFFFE070│+0x0008:0x000055551c0→   推送r15
0x00007FFFFFE078│+0x0010:0x00007ffff7e1ebbb→   电子数据交换
0x00007FFFFFE080│+0x0018:0x0000000000000000
0x00007FFFFFE088│+0x0020:0x00007FFFFFE158→  0x00007FFFFFE436→  “/media/sf_Code/asm/vuln”
0x00007FFFFFE090│+0x0028:0x00000002000100000
0x00007FFFFFE098│+0x0030:0x00005555145→   推动rbp
0x00007FFFFFE0A0│+0x0038:0x0000000000000000
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 代码:x86:64────
0x7FFFFFE152添加字节PTR[rax],al
0x7FFFFFE154添加字节PTR[rax],al
0x7FFFFFE156添加字节PTR[rax],al
→ 0x7FFFFFE158不锈钢在铝中,0xff
0x7FFFFFE15B(坏)
0x7FFFFFE15C(坏)
0x7FFFFFE15D jg 0x7FFFFFE15F
0x7FFFFFE15F添加字节PTR[rsi-0x1c],cl
0x7FFFFFE162(坏)
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 线程────
[#0]Id 1,名称:“vuln”,在中停止0x7fffffffe158??(),原因:SIGSEGV
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 痕迹────
[0]0x7FFFFFE158→ al中的ss,0xff

为什么
printf
没有打印出字符串

stdout默认为行缓冲,字符串不以换行符结尾。如果您将其更改为
put(“Pwned!!”)stdout
将在
put
返回之前刷新

但是,使用
printf
,数据只是放在stdio缓冲区中,直到其他东西打印换行符,或者直到
fflush(stdout)
exit()
或从
main
干净地返回将导致fflush,但segfaulting将终止进程,而不会进行系统调用以将该I/O数据交给操作系统

这与使用
\u exit(2)
系统调用而不是segfaulting的情况完全相同


如果目标是强制调用
win()

但是如果
win()
被认为代表成功的ROP攻击,调用
system()
execve
Program received signal SIGSEGV, Segmentation fault.
0x00007fffffffe158 in ?? ()
[ Legend: Modified register | Code | Heap | Stack | String ]
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── registers ────
$rax   : 0x7               
$rbx   : 0x0               
$rcx   : 0x0               
$rdx   : 0x0               
$rsp   : 0x00007fffffffe068  →  0x0000000200000000
$rbp   : 0x4141414141414141 ("AAAAAAAA"?)
$rsi   : 0x656e7750        
$rdi   : 0x00005555555592a0  →  "Pwned!! string: "
$rip   : 0x00007fffffffe158  →  0x00007fffffffe436  →  "/media/sf_Code/asm/vuln"
$r8    : 0x00007ffff7fb9500  →  0x00007ffff7fb9500  →  [loop detected]
$r9    : 0x7               
$r10   : 0x0000555555556004  →  0x00212164656e7750 ("Pwned!!"?)
$r11   : 0x246             
$r12   : 0x0000555555555060  →  <_start+0> xor ebp, ebp
$r13   : 0x00007fffffffe150  →  0x0000000000000002
$r14   : 0x0               
$r15   : 0x0               
$eflags: [zero carry PARITY ADJUST sign trap INTERRUPT direction overflow RESUME virtualx86 identification]
$cs: 0x0033 $ss: 0x002b $ds: 0x0000 $es: 0x0000 $fs: 0x0000 $gs: 0x0000 
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── stack ────
0x00007fffffffe068│+0x0000: 0x0000000200000000   ← $rsp
0x00007fffffffe070│+0x0008: 0x00005555555551c0  →  <__libc_csu_init+0> push r15
0x00007fffffffe078│+0x0010: 0x00007ffff7e1ebbb  →  <__libc_start_main+235> mov edi, eax
0x00007fffffffe080│+0x0018: 0x0000000000000000
0x00007fffffffe088│+0x0020: 0x00007fffffffe158  →  0x00007fffffffe436  →  "/media/sf_Code/asm/vuln"
0x00007fffffffe090│+0x0028: 0x0000000200100000
0x00007fffffffe098│+0x0030: 0x0000555555555145  →  <main+0> push rbp
0x00007fffffffe0a0│+0x0038: 0x0000000000000000
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── code:x86:64 ────
   0x7fffffffe152                  add    BYTE PTR [rax], al
   0x7fffffffe154                  add    BYTE PTR [rax], al
   0x7fffffffe156                  add    BYTE PTR [rax], al
 → 0x7fffffffe158                  ss     in  al, 0xff
   0x7fffffffe15b                  (bad)  
   0x7fffffffe15c                  (bad)  
   0x7fffffffe15d                  jg     0x7fffffffe15f
   0x7fffffffe15f                  add    BYTE PTR [rsi-0x1c], cl
   0x7fffffffe162                  (bad)  
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── threads ────
[#0] Id 1, Name: "vuln", stopped 0x7fffffffe158 in ?? (), reason: SIGSEGV
─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── trace ────
[#0] 0x7fffffffe158 → ss in  al, 0xff