-
-
[原创]risc-v环境搭建及调试
-
发表于: 2022-5-10 21:20 13977
-
gdb-multiarch是含有多种架构接口的调试器
对于一般的非x86架构的程序,可以用user模式模拟,有的可能需要system模式来模拟程序运行所需的环境
直接把所有仓库都克隆下来
因为这个工具链太大了,所以make需要很长的时间,而且还可能会报错(别问我怎么知道的┭┮﹏┭┮),而且没有我所需要的riscv64-linux-gnu-gdb,所以我选择直接下载gz文件
网址:https://github.com/riscv-collab/riscv-gnu-toolchain/releases
解压之后,在bin目录下会有各种工具。
就可以使用了
题目里给了docker,这种题可以在dockerfile里换源在build,这样成功率高很多。题目是一道risc-v的架构,由于不能用ida反汇编,我直接读了下汇编代码,幸好不长;
其实我也用ghrdia了,但是我环境有问题,一直不能反汇编。
调试一下得
risc-v的返回地址存在ra内,利用分析在下面。
这里说一下怎么调试,在entrypoint.sh内加上-g 9000,然后启动docker;
之后开两个终端,一个nc 127.0.0.1 9999,另一个终端运行gdb-multiarch riscv,在target remote 127.0.0.1:9000
gets的时候我们输入了8字节的a,栈的地址为0x40008009c0
从0x40008009c8(sp+8处)开始读入,我们看到后面的汇编也比较简单。由于对risc-v的汇编不是很熟悉,就单步一下看看变化,就是将s0-528处的数据传给a0;
再下面就是将sp+512地址处的数据传给s0;
后面就到了重头戏,ra的控制;所以我们只需要控制sp+520处的数据,就可以劫持程序执行流程。
sudo apt
-
get install gdb
-
multiarch
sudo apt
-
get install gdb
-
multiarch
sudo apt install qemu
-
user
sudo apt install qemu
-
user
git clone
-
-
recursive https:
/
/
github.com
/
riscv
-
collab
/
riscv
-
gnu
-
toolchain.git
.
/
configure
-
-
prefix
=
/
opt
/
riscv
make
git clone
-
-
recursive https:
/
/
github.com
/
riscv
-
collab
/
riscv
-
gnu
-
toolchain.git
.
/
configure
-
-
prefix
=
/
opt
/
riscv
make
Arch: em_riscv
-
64
-
little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (
0x10000
)
RWX: Has RWX segments
Arch: em_riscv
-
64
-
little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (
0x10000
)
RWX: Has RWX segments
var_s0
=
0
var_s8
=
8
arg_0
=
10h
addi sp, sp,
-
210h
/
/
528
sd ra,
200h
+
var_s8(sp)
sd s0,
200h
+
var_s0(sp)
addi s0, sp,
200h
+
arg_0
li a1,
0
sd a1,
-
210h
(s0)
sw a1,
-
14h
(s0)
ld a0, stdin_ptr
ld a0,
0
(a0)
jal setbuf
ld a1,
-
210h
(s0)
ld a0, stdout_ptr
ld a0,
0
(a0)
jal setbuf
la a1, failed
li a0,
0Bh
jal ssignal
la a0, aDonTMiss
# "Don't miss!"
jal puts
la a0, asc_4C6FC
# "> "
jal printf
addi a0, s0,
-
208h
jal gets
/
/
栈溢出
ld a0,
-
210h
(s0)
ld s0,
200h
+
var_s0(sp)
ld ra,
200h
+
var_s8(sp)
/
/
ra为返回地址
addi sp, sp,
210h
ret
var_s0
=
0
var_s8
=
8
arg_0
=
10h
addi sp, sp,
-
210h
/
/
528
sd ra,
200h
+
var_s8(sp)
sd s0,
200h
+
var_s0(sp)
addi s0, sp,
200h
+
arg_0
li a1,
0
sd a1,
-
210h
(s0)
sw a1,
-
14h
(s0)
ld a0, stdin_ptr
ld a0,
0
(a0)
jal setbuf
ld a1,
-
210h
(s0)
ld a0, stdout_ptr
ld a0,
0
(a0)
jal setbuf
la a1, failed
li a0,
0Bh
jal ssignal
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
- [原创]ByteCTF2022 mobile系列 49961
- qemu逃逸系列 26506
- [原创]UnCrackable Level 2.app 21327
- Xcode和iOS App Signer签名 21915
- [原创]Linux内核学习笔记 13858