2024 iscc
又快iscc了复现一下去年的,打这个比赛的时候还是个刚入门的小菜鸡
ISCC_U
和hicton lab中的那个UAF一样,但没有后门函数需要泄露地址,堆块限制5个
思路:
- 通过unsortedbin泄露地址
- uaf嘛,借助hicton lab那道题的思想,篡改结构体中的print_note_content的指针为system
glibc2.23的情况下
1 | #!/usr/bin/env python3 |
glibc2.31的情况下,思路一样,第一个堆块要大于0x400放入unsortedbin中
1 | #!/usr/bin/env python3 |
收获
32位get shell : add(0x8, p32(system_addr) + b';sh\x00')
heapheap
有沙盒
但是四个功能齐全
miao
格式化字符串 + ret2syscall
1 | #!/usr/bin/env python3 |
32位寄存器传参
寄存器传递:
- 前 5 个整型或指针类型的参数通过寄存器传递。这些寄存器是:
EAX
:用于返回值EBX
、ECX
、EDX
、ESI
和EDI
:用于传递参数(参数列表从左到右的顺序)
mprotect
mprotect()
函数是一个系统调用,用于更改已映射内存区域的保护属性。它通常在需要更改内存区域的访问权限时使用,例如在实现内存保护、执行代码或读写操作时。mprotect()
函数通常用于操作系统的内存管理,特别是在 Unix/Linux 系统中。
函数原型
1 |
|
参数
addr
:指向要更改保护属性的内存区域的起始地址。该地址必须是页面大小的倍数,通常为 4096 字节(4KB)。len
:要更改保护属性的内存区域的长度(以字节为单位)。同样,这个值也必须是页面大小的倍数。prot
:新的保护属性标志,可以是以下之一的组合:PROT_READ
:允许读取。PROT_WRITE
:允许写入。PROT_EXEC
:允许执行。PROT_NONE
:禁止访问。
返回值
如果成功,
mprotect()
返回 0。如果失败,返回 -1,并且设置
1
errno
以指示错误类型。常见的错误包括:
EINVAL
:无效的参数(例如,addr
不是页面大小的倍数)。ENOMEM
:请求的内存区域无法访问。EPERM
:试图设置不允许的保护属性(例如,尝试执行一个没有执行权限的内存区域)。