C 为什么没有';t printf打印出缓冲区溢出中的字符串?
我正在学习缓冲区溢出。我写了一个小C程序: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
#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