小我PWN入坑罕见要领总结 | 申博官网
登录
  • 欢迎进入申博官网!
  • 如果您觉得申博官网对你有帮助,那么赶紧使用Ctrl+D 收藏申博官网并分享出去吧
  • 这里是申博官方网!
  • 申博官网是菲律宾sunbet官网品牌平台!
  • 申博开户专业品牌平台!

小我PWN入坑罕见要领总结

申博_新闻事件 申博 163次浏览 已收录 0个评论

申博网络安全巴士站

申博-网络安全巴士站是一个专注于网络安全、系统安全、互联网安全、信息安全,全新视界的互联网安全新媒体。

————————————-

0×01 概述

本文引见小我进修pwn过程当中的一些总结,包孕常常运用要领,网上诸多教程虽然有供应完全的exp,但并未诠释exp为何是如许的,好比shellcode写到那里去了(这关系到跳转地点),ROP链怎样挑选的。关于pwn,自己也是新手,个中有总结毛病的,迎接列位大佬斧正。

文中用到的测试递次都在:https://github.com/silience/pwn

0×02 PWN常常运用的基本知识

起首拿到一个PWN递次,能够先运用file敕令,推断是32位照样64位。

能够运用objdump读取plt和got表,plt和got网上都有细致的引见,再此不再赘述。

小我PWN入坑罕见要领总结

这边要提一下数据在寄存器中的寄存递次,这个在花样化字符串破绽中要分外注重,迥殊是64位,32位的先后递次是eax->edx->ecx->ebx,64位的先后递次是rdi->rsi->rdx->rcx->r8->r9。

刚最先进修的时刻,小我常常把pop和push常常搞反,因而在此把这两个指令的引见说一下:push [reg]/[num] 是将reg寄存器中的值或是数字num压入客栈中,而pop [reg]是将客栈栈顶的值弹出到reg寄存器中,并将这个值从客栈中删去。

偶然刻要检察寄存器中的值,能够用到以下敕令:

 

print $esp:打印esp的值

x/10x $esp:打印出10个从esp最先的值

x/10x $esp-4:打印出10个从偏移4最先的值

x/10gx $esp:以64位花样打印

 

 

下面先运用hello练练手,起首运用IDA的F5大法能够看到内部有个getshell函数,能够直接跳转到该函数getshell。

运用对象pade能够很轻易的计算出偏移量,pattern create 100。

pattern offset 0×41284141,计算出偏移量为22。

检察汇编代码,猎取getshell的地点,也就是要跳转的地点。

末了取得完全的exp以下。

0×03 shellcode

天生体式格局

1、在shellcode数据库网站找一个shellcode,http://shell-storm.org/shellcode/

2、运用kali的msfvenon天生shellcode,如敕令msfvenon -p linux/x86/exec CMD=/bin/sh -f python

3、运用pwntools自带的函数如asm(shellcraft.sh())

但偶然刻不知道shellcode写到那里去了,在回覆这个题目前,要提一下bss段、data段、text段、堆(heap)、栈(stack)的一些区分。

1、bss段(bss segment)一样平常是指用来寄存递次中未初始化的全局变量的一块内存地区,bss段属于静态内存分派。

2、data段:数据段(data segment)一样平常是指用来寄存递次中已初始化的全局变量的一块内存地区,数据段属于静态内存分派。

3、text段:代码段(code segment/text segment)一样平常是指用来寄存递次实行代码的一块内存地区。这部分地区的巨细在递次运转前就已肯定,而且内存地区一样平常属于只读(某些架构也许可代码段为可写,即许可修正递次)。在代码段中,也有能够包罗一些只读的常数变量,比方字符串常量等。

4、堆(heap):堆是用于寄存历程运转中被动态分派的内存段,它的巨细其实不流动,可动态扩大或缩减。当历程挪用malloc等函数分派内存时,新分派的内存就被动态添加到堆上(堆被扩大);当应用free等函数开释内存时,被开释的内存从堆中被剔除(堆被缩减)。

5、栈(stack):栈又称客栈,是用户寄存递次暂时建立的局部变量,也就是说我们函数括弧“{}”中界说的变量(但不包孕static声明的变量,static意味着在数据段中寄存变量)。除此以外,在函数被挪用时,其参数也会被压入提议挪用的历程栈中,而且待到挪用完毕后,函数的返回值也会被寄存回栈中。由于栈的先进先出(FIFO)特性,以是栈迥殊轻易用来生存/规复挪用现场。

下面以ret2shellcode,一样运用IDA看下代码,很明显,shellcode写入到bss段。

小我PWN入坑罕见要领总结

运用敕令readelf -S ret2shellcode检察猎取bss段地点为0x0804a040。

还必需包管bss段有可实行权限,shellcode能力运转,可用gdb调试的vmmap敕令检察,发明bss段可读可写可实行。局限是0x0804a000到0x0804b000,bss段地点0x0804a040在这个区间,且必需包管shellcode长度不凌驾这个区间便可,但到目前为止,shellcode具体地点依旧不知道。

这时候能够去挪用它的函数strncpy前检察汇编代码,一样平常经由过程push或许move举行参数通报,参数通报递次是从右到左,能够定位到shellcode地点0x804a80。

末了exp以下。

shellcode地点的地位实际上是一个坑。由于一般的头脑是运用gdb调试目标递次,然后检察内存来肯定shellcode的地位。但当你真的实行exp的时刻你会发明shellcode压根就不在这个地点上!这是为何呢?原因是gdb的调试情况会影响buf在内存中的地位,虽然我们封闭了ASLR,但这只能包管buf的地点在gdb的调试情况中稳定,但当我们直接实行的时刻,buf的地位会流动在其余地点上。怎样处理这个题目呢?有两种要领,一种是 开启core dump这个功用,别的一种是运用GDB的attach功用。

能够运用level1练手,偶然checksec显现PIE封闭。

众安天下招聘安全工程师

北京众安天下科技有限公司简称为“众安天下(Allsec)”,专注于互联网安全众测服务领域。众测顾名思义:聚合跨地域、跨业务领域、跨技术领域的众多安全专家的合力,帮助客户排除安全漏洞隐患,提升客户业务安全软实力。因此,取名“众安

其有用ldd会发明,地点依旧会随机转变。

可运用敕令echo 0 > /proc/sys/kernel/randomize_va_space关掉全部linux体系的ASLR珍爱,再举行调试;开启core dump这个功用,开启以后,当涌现内存毛病的时刻,体系会天生一个core dump文件在tmp目录下。然后我们再用gdb检察这个core文件就能够猎取到buf真正的地点了。

 

ulimit -c unlimited

sudo sh -c ‘echo “/tmp/core.%t” > /proc/sys/kernel/core_pattern’

 

 

0×04 花样化字符串破绽

这要讲一下字节序。

大端就是:存储最高有用字节在最小的地点(收集传输文件存储常常运用)。

小端就是:存储最低有用字节在最小的地点(计算机内部存储)。

资助影象的方法:小端就是存储先存最小有用字节,大端就是先存最大有用字节。

小我PWN入坑罕见要领总结

printf函数的花样化字符串罕见的有 %d,%f,%c,%s(用于读取内存数据),%x(输出16进制数,前面没有0x),%p(输出16进制数,前面带有0x);%n是一个不经常常运用到的花样符,它的作用是把前面已打印的长度写入某个内存地点,用于修正内存,除%n,另有%hn,%hhn,%lln,分别为写入目标空间4字节,2字节,1字节,8字节。

去读内存,若是当偏移量为5时:

 

./a.out "`printf "\0x78\x56\x34\x12"`.%08x.%08x.%08x.%08x.%08s"

 

或许直接运用读取地点0×12345678的内容:

 

./a.out "`printf "\0x78\x56\x34\x12"`.%5\$s"

 

好比要将跳转地点0x0804a048改data为0×12345678,可运用%hhn;由于运用的是小段序,高字节生存在高地点。

以是poc以下,偏移量要从6最先,应为\x4b\xa0\x04\x08生存在偏移地点6。

 

./a.out "`printf "%18c%6\$hhn"."%34c%7\$hhn"." %34c%8\$hhn "."%34c%9\$hhn "."\x4b\xa0\x04\x08"."\x4b\xa0\x04\x08"."\x4b\xa0\x04\x08"."\x4b\xa0\x04\x08"

 

然则为何顺次是%18c、%34c、%34c、%34c;第一个是0×12,很简单,酿成十进制就是18;第二个是0×34,十进制52,第二次总写入数包孕第一次的,即18+34=52;背面两次依此类推。

实际运用中,能够直接运用pwntools的函数fmtstr_payload,或许fmt_str(offset,size,addr,target)(个中offset透露表现要掩盖的地点最后的偏移,size透露表现机械字长,addr透露表现将要掩盖的地点,target透露表现我们要掩盖为的目标变量值)直接掩盖。

能够以湖湘杯2017的pwn200举行练手,运用IDA,发明很明显的花样化字符串破绽。

起首输入AAAA.%X.%X.%X.%X.%X.%X.%X.%X,能够发明在第七个%X输出41414141,A的ascii码是41(偶然是61616161,a的ascii码61,由于递次把输入转换成小写),可知偏移量是7,起首运用%s猎取puts函数的实在地点,然后计算出system的实在地点,背面再应用函数fmtstr_payload,将atoi的地点替换为system地点,当实行atoi时,就会这些system函数,从而猎取shell。

0×05 libc

libc中供应了大批的函数,gdb调试时可直接运用以下敕令猎取地点,若是未供应,能够去网站http://libcdb.com/下载对应的文件。

可顺次实行以下敕令,疾速getshell。

print system#猎取system函数地点。

 

print __libc_start_main

find 0xb7e393f0, +2200000, “/bin/sh”#猎取参数”/bin/sh”的地点

 

 

小我PWN入坑罕见要领总结

以level2为例,exp以下,应用链:偏移数据+system地点+返回地点+参数地点,本例是经由过程system取得shell,不需要做其他操纵,以是返回地点能够随意写。

0×06 ROP

Rop链递次,起首是跳转地点,好比要挪用的内置函数write泄显露system地点,然后是返回地点(若是泄漏的地点要重复运用,则返回地点是write地点或许它前面的地点),再就是通报的参数是从右往左入栈。

以ret2syscall为例,rop链组织以下:由于要挪用execve(“/bin/sh”,NULL,NULL),该体系函数的挪用号为0xb,因而起首要将0xb给eax寄存器,可运用ROPgadget –binary ret2syscall –only “pop|ret” | grep “eax”举行查找。

由于函数execve有三个参数,接着能够运用敕令。

ROPgadget –binary ret2syscall –only “pop|pop|pop|ret” | grep “ebx”,不克不及选包罗esi(esi是下条指令实行地点)或许ebp(栈基址寄存器)。

使ROPgadget –binary ret2syscall –string ‘/bin/sh’,可查找参数/bin/sh 的地点。

末了再跳转到int 0×80的地点便可实行对应的体系挪用,也就是execve函数,可经由过程ROPgadget –binary ret2syscall –only ‘int’,找int 0×80的地点。

末了完全的exp以下。

送书福利 | 管理者必读经典,圈内大佬亲笔签名的企业安全建设指南

FreeBuf 猪年第一波送书活动献给了刚刚诞生的「FreeBuf企业安全」服务号!免费送五本《互联网企业安全高级指南》,详见活动细则! 想必不少人已经注意到了,FreeBuf正式上线了专注企业安全的精品内容分享平台的企业服务号,第一篇首推了


申博|网络安全巴士站声明:该文看法仅代表作者自己,与本平台无关。版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明小我PWN入坑罕见要领总结
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址