首页
论坛
课程
招聘
[分享]iOS 第二题解题日志
2015-10-18 21:30 1984

[分享]iOS 第二题解题日志

2015-10-18 21:30
1984
所用设备:-
所用工具:IDA Pro 6.8/WinHex

下载题目后发现是一个zip文件比较诧异,解压后是个bin文件,更诧异。不过看过题目.txt后,比较释怀。

由于kernelcache是已经解密过的,就可以直接载入到IDA中分析。
目标是要找到几个设备cdevsw结构体中read write ioctl所对应的函数地址
先了解cdevsw结构体:
struct cdevsw {
	int	(*d_open)	__P((dev_t dev, int oflags, int devtype,
				     struct proc *p));
	int	(*d_close)	__P((dev_t dev, int fflag, int devtype,
				     struct proc *));
	int	(*d_read)	__P((dev_t dev, struct uio *uio, int ioflag));
	int	(*d_write)	__P((dev_t dev, struct uio *uio, int ioflag));
	int	(*d_ioctl)	__P((dev_t dev, int cmd, caddr_t data,
				     int fflag, struct proc *p));
	int	(*d_stop)	__P((struct tty *tp, int rw));
	int	(*d_reset)	__P((int uban));	/* XXX */
	struct	tty *d_ttys;
	int	(*d_select)	__P((dev_t dev, int which, struct proc *p));
	int	(*d_mmap)	__P(());
	int	(*d_strategy)	__P((struct buf *bp));
};

read write ioctl三个挨在一次
分别是cdevsw+8, cdevsw+12, cdevsw+16

切入分析
已知cdevsw结构体需要由cdevsw_add函数统一注册,期间免不了调用cdevsw_add,所以在IDA Function window中搜索cdevsw_add,查看xref。

有几个sub_xxxx,挨个点进去看看
首先能看到random的注册

如何确定?
调用cdevsw_add后,下面如果包含了random字符串,就基本可以确认了。

又已知cdevsw_add第二参数为cdevsw结构体,所以确定了r1的地址,就可以找到结构体了
如汇编显示
r1根据0x803BD360+offset来确定地址,直接算好这个地址,在IDA中CTRL+G,进入地址,就能看到结构体本身了。

根据如上方法,找到3个设备的cdevsw结构体,再确定三个函数的地址,就能得到通关口令。

地址如下图:
/dev/random

/dev/pf

/dev/ptmx


答案为 address | thumb_flag, 且小写
0x800c0ea1#0x800c0e39#0x800c0e05#0x802873ad#0x802873ad#0x80149d19#0x80292251#0x80292661#0x8029298d

2021 KCTF 秋季赛 防守篇-征题倒计时(11月14日截止)!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回