强网杯2018 core环境搭建

环境准备

题目链接

https://github.com/eternalsakura/ctf_pwn/blob/master/%E5%BC%BA%E7%BD%91%E6%9D%AF2018/core_give.tar

调试环境

ubuntu14.04

1
2
sakura@ubuntu:~$ uname -a
Linux ubuntu 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

gdb 7.7.1

1
2
sakura@ubuntu:~$ gdb -v
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.3) 7.7.1

下载qemu

1
sudo apt-get install qemu qemu-system

打开虚拟化

这个在cpu那里
vm版本:

pd版本:

start.sh

本来这样应该就可以了,不过有几个坑点我还是要说一下。

  • -m megs set virtual RAM size to megs MB [default=128]
    原先shell里指定的是64M,这样会GG,起码改成128M,觉得不够还可以加。
  • -kernel bzImage use ‘bzImage’ as kernel image
    指定kernel image
  • -initrd file use ‘file’ as initial ram disk
    要运行不能只有内核,这里是相当于指定一个硬盘(使用软件将RAM模拟当做硬盘来使用)
    cpio是一种文件系统,后面解包就看懂了。
  • -append cmdline use ‘cmdline’ as kernel command line
    没什么好说的,调试的时候可以关了kaslr,指定no kaslr
  • -s shorthand for -gdb tcp::1234
    这东西坑了我很久,意思是-gdb tcp::1234这个命令的缩写,所以你在后面再指定gdb,或者进了monitor(这种方法参考muhe师傅的文章,也就是启动时按ctrl+alt+2,反正mac的虚拟机里没法按……我就不这样了)再运行gdbserver都会报 Duplicate ID ‘gdb’ for chardev。

这样运行shell应该就可以了。


关闭定时power down

类似alarm,如图,直接自己就结束了。

要改掉这个,也是删掉一个配置就行了,不过这个要在init里改了,如图,就是这句,删掉就好了

而我们知道实际上这个硬盘是那个cpio文件,所以要删除这句话的话,首先需要解包cpio,删了这句话,然后重新打包。

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
sakura@ubuntu:~/Desktop/give_to_player$ ls
bzImage core.cpio start.sh vmlinux
sakura@ubuntu:~/Desktop/give_to_player$ mkdir core
sakura@ubuntu:~/Desktop/give_to_player$ mv core.cpio ./core/core.cpio.gz
sakura@ubuntu:~/Desktop/give_to_player$ cd core
sakura@ubuntu:~/Desktop/give_to_player/core$ ls
core.cpio.gz
sakura@ubuntu:~/Desktop/give_to_player/core$ gunzip core.cpio.gz
sakura@ubuntu:~/Desktop/give_to_player/core$ ls
core.cpio
sakura@ubuntu:~/Desktop/give_to_player/core$ cpio -idmv < core.cpio
.
bin
bin/ionice
bin/iostat
bin/ipcalc
bin/kbd_mode
bin/linux32
...
...
...
root
root/flag
core.ko
tmp
init
vmlinux
104379 blocks
sakura@ubuntu:~/Desktop/give_to_player/core$ ls
bin core.cpio core.ko etc gen_cpio.sh init lib lib64 linuxrc proc root sbin sys tmp usr vmlinux
sakura@ubuntu:~/Desktop/give_to_player/core$ rm -rf core.cpio
sakura@ubuntu:~/Desktop/give_to_player/core$ ls
bin core.ko etc gen_cpio.sh init lib lib64 linuxrc proc root sbin sys tmp usr vmlinux
sakura@ubuntu:~/Desktop/give_to_player/core$ vim init
sakura@ubuntu:~/Desktop/give_to_player/core$ ./gen_cpio.sh core.cpio
.
./usr
./usr/sbin
./usr/sbin/delgroup
./usr/sbin/i2cdump
./usr/sbin/rtcwake
./usr/sbin/i2cget
./usr/sbin/ubiattach
./usr/sbin/dhcprelay
...
...
...
./bin/ping
./bin/busybox
./bin/kbd_mode
./bin/sh
./bin/grep
./bin/base64
./bin/mount
104379 blocks

sakura@ubuntu:~/Desktop/give_to_player/core$ ls
bin core.cpio core.ko etc gen_cpio.sh init lib lib64 linuxrc proc root sbin sys tmp usr vmlinux
sakura@ubuntu:~/Desktop/give_to_player/core$ mv core.cpio ../core.cpio
sakura@ubuntu:~/Desktop/give_to_player/core$ cd ..
sakura@ubuntu:~/Desktop/give_to_player$ ls
bzImage core core.cpio start.sh vmlinux
sakura@ubuntu:~/Desktop/give_to_player$ rm -rf core

解释一下,上面这些log里最重要的就是cpio的解包和打包。

  1. 解包的坑点是cpio文件应该这么解压,先用gunzip,再用cpio -idmv,但是gunzip认后缀不认文件格式,所以我们要先重命名为core.cpio.gz,再cpio -idmv提取。
    1
    2
    gunzip 文件名.cpio.gz
    cpio -idmv < 文件名.cpio
  2. 打包这个……师傅告诉我里面的gen_cpio.sh就是打包的shell,$1是我们输入的参数,也就是要输出的文件名。
    比如./gen_cpio.sh core.cpio就代表打包后输出的文件名为core.cpio。
    1
    2
    3
    4
    / $ cat gen_cpio.sh 
    find . -print0 \
    | cpio --null -ov --format=newc \
    | gzip -9 > $1
    可以看到这样就删掉了,就不会2分钟后自动终止了。

其他

这样我们的搭建就完成了,看上去不复杂,我还是踩坑踩了一晚上,不过这样qemu+gdb调试kernel其实也会了(我后面应该会写怎么搭建)
感谢师傅们指导了QVQ。