Skip to content

Commit cb54085

Browse files
Add basic RISCV64 shellcraft support (#2322)
* Add basic RISCV64 shellcraft support The `mov` template isn't 100% null-byte and newline free for all inputs. Certain larger values are just emitted using the `li` pseudo-instruction by the assembler which might contain null-bytes. Co-authored-by: LevitatingLion <[email protected]> * Generate RISCV syscall constants from musl-libc diet-libc doesn't support RISCV, so borrow from musl. Need to consider their license. * Update CHANGELOG * Fix CHANGELOG --------- Co-authored-by: LevitatingLion <[email protected]>
1 parent 8ba1bdf commit cb54085

31 files changed

+4489
-1
lines changed

.github/workflows/ci.yml

+1
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ jobs:
7878
binutils-powerpc-linux-gnu \
7979
binutils-s390x-linux-gnu \
8080
binutils-sparc64-linux-gnu \
81+
binutils-riscv64-linux-gnu \
8182
gcc-multilib \
8283
libc6-dbg \
8384
elfutils \

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,13 @@ The table below shows which release corresponds to each branch, and what date th
7575
- [#2356][2356] Add local libc database provider for libcdb
7676
- [#2374][2374] libcdb.unstrip_libc: debug symbols are fetched only if not present
7777
- [#2327][2327] Add basic support to debug processes on Windows
78+
- [#2322][2322] Add basic RISCV64 shellcraft support
7879

7980
[2360]: https://github.com/Gallopsled/pwntools/pull/2360
8081
[2356]: https://github.com/Gallopsled/pwntools/pull/2356
8182
[2374]: https://github.com/Gallopsled/pwntools/pull/2374
8283
[2327]: https://github.com/Gallopsled/pwntools/pull/2327
84+
[2322]: https://github.com/Gallopsled/pwntools/pull/2322
8385

8486
## 4.13.0 (`beta`)
8587

docs/source/shellcraft/riscv64.rst

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
.. testsetup:: *
2+
3+
from pwn import *
4+
context.clear(arch='riscv64')
5+
6+
:mod:`pwnlib.shellcraft.riscv64` --- Shellcode for RISCV64
7+
===========================================================
8+
9+
:mod:`pwnlib.shellcraft.riscv64`
10+
-------------------------------
11+
12+
.. automodule:: pwnlib.shellcraft.riscv64
13+
:members:
14+
15+
:mod:`pwnlib.shellcraft.riscv64.linux`
16+
---------------------------------------
17+
18+
.. automodule:: pwnlib.shellcraft.riscv64.linux
19+
:members:

pwnlib/constants/linux/riscv64.py

+1,306
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,304 @@
1+
#define __NR_io_setup 0
2+
#define __NR_io_destroy 1
3+
#define __NR_io_submit 2
4+
#define __NR_io_cancel 3
5+
#define __NR_io_getevents 4
6+
#define __NR_setxattr 5
7+
#define __NR_lsetxattr 6
8+
#define __NR_fsetxattr 7
9+
#define __NR_getxattr 8
10+
#define __NR_lgetxattr 9
11+
#define __NR_fgetxattr 10
12+
#define __NR_listxattr 11
13+
#define __NR_llistxattr 12
14+
#define __NR_flistxattr 13
15+
#define __NR_removexattr 14
16+
#define __NR_lremovexattr 15
17+
#define __NR_fremovexattr 16
18+
#define __NR_getcwd 17
19+
#define __NR_lookup_dcookie 18
20+
#define __NR_eventfd2 19
21+
#define __NR_epoll_create1 20
22+
#define __NR_epoll_ctl 21
23+
#define __NR_epoll_pwait 22
24+
#define __NR_dup 23
25+
#define __NR_dup3 24
26+
#define __NR_fcntl 25
27+
#define __NR_inotify_init1 26
28+
#define __NR_inotify_add_watch 27
29+
#define __NR_inotify_rm_watch 28
30+
#define __NR_ioctl 29
31+
#define __NR_ioprio_set 30
32+
#define __NR_ioprio_get 31
33+
#define __NR_flock 32
34+
#define __NR_mknodat 33
35+
#define __NR_mkdirat 34
36+
#define __NR_unlinkat 35
37+
#define __NR_symlinkat 36
38+
#define __NR_linkat 37
39+
#define __NR_umount2 39
40+
#define __NR_mount 40
41+
#define __NR_pivot_root 41
42+
#define __NR_nfsservctl 42
43+
#define __NR_statfs 43
44+
#define __NR_fstatfs 44
45+
#define __NR_truncate 45
46+
#define __NR_ftruncate 46
47+
#define __NR_fallocate 47
48+
#define __NR_faccessat 48
49+
#define __NR_chdir 49
50+
#define __NR_fchdir 50
51+
#define __NR_chroot 51
52+
#define __NR_fchmod 52
53+
#define __NR_fchmodat 53
54+
#define __NR_fchownat 54
55+
#define __NR_fchown 55
56+
#define __NR_openat 56
57+
#define __NR_close 57
58+
#define __NR_vhangup 58
59+
#define __NR_pipe2 59
60+
#define __NR_quotactl 60
61+
#define __NR_getdents64 61
62+
#define __NR_lseek 62
63+
#define __NR_read 63
64+
#define __NR_write 64
65+
#define __NR_readv 65
66+
#define __NR_writev 66
67+
#define __NR_pread64 67
68+
#define __NR_pwrite64 68
69+
#define __NR_preadv 69
70+
#define __NR_pwritev 70
71+
#define __NR_sendfile 71
72+
#define __NR_pselect6 72
73+
#define __NR_ppoll 73
74+
#define __NR_signalfd4 74
75+
#define __NR_vmsplice 75
76+
#define __NR_splice 76
77+
#define __NR_tee 77
78+
#define __NR_readlinkat 78
79+
#define __NR_newfstatat 79
80+
#define __NR_fstat 80
81+
#define __NR_sync 81
82+
#define __NR_fsync 82
83+
#define __NR_fdatasync 83
84+
#define __NR_sync_file_range 84
85+
#define __NR_timerfd_create 85
86+
#define __NR_timerfd_settime 86
87+
#define __NR_timerfd_gettime 87
88+
#define __NR_utimensat 88
89+
#define __NR_acct 89
90+
#define __NR_capget 90
91+
#define __NR_capset 91
92+
#define __NR_personality 92
93+
#define __NR_exit 93
94+
#define __NR_exit_group 94
95+
#define __NR_waitid 95
96+
#define __NR_set_tid_address 96
97+
#define __NR_unshare 97
98+
#define __NR_futex 98
99+
#define __NR_set_robust_list 99
100+
#define __NR_get_robust_list 100
101+
#define __NR_nanosleep 101
102+
#define __NR_getitimer 102
103+
#define __NR_setitimer 103
104+
#define __NR_kexec_load 104
105+
#define __NR_init_module 105
106+
#define __NR_delete_module 106
107+
#define __NR_timer_create 107
108+
#define __NR_timer_gettime 108
109+
#define __NR_timer_getoverrun 109
110+
#define __NR_timer_settime 110
111+
#define __NR_timer_delete 111
112+
#define __NR_clock_settime 112
113+
#define __NR_clock_gettime 113
114+
#define __NR_clock_getres 114
115+
#define __NR_clock_nanosleep 115
116+
#define __NR_syslog 116
117+
#define __NR_ptrace 117
118+
#define __NR_sched_setparam 118
119+
#define __NR_sched_setscheduler 119
120+
#define __NR_sched_getscheduler 120
121+
#define __NR_sched_getparam 121
122+
#define __NR_sched_setaffinity 122
123+
#define __NR_sched_getaffinity 123
124+
#define __NR_sched_yield 124
125+
#define __NR_sched_get_priority_max 125
126+
#define __NR_sched_get_priority_min 126
127+
#define __NR_sched_rr_get_interval 127
128+
#define __NR_restart_syscall 128
129+
#define __NR_kill 129
130+
#define __NR_tkill 130
131+
#define __NR_tgkill 131
132+
#define __NR_sigaltstack 132
133+
#define __NR_rt_sigsuspend 133
134+
#define __NR_rt_sigaction 134
135+
#define __NR_rt_sigprocmask 135
136+
#define __NR_rt_sigpending 136
137+
#define __NR_rt_sigtimedwait 137
138+
#define __NR_rt_sigqueueinfo 138
139+
#define __NR_rt_sigreturn 139
140+
#define __NR_setpriority 140
141+
#define __NR_getpriority 141
142+
#define __NR_reboot 142
143+
#define __NR_setregid 143
144+
#define __NR_setgid 144
145+
#define __NR_setreuid 145
146+
#define __NR_setuid 146
147+
#define __NR_setresuid 147
148+
#define __NR_getresuid 148
149+
#define __NR_setresgid 149
150+
#define __NR_getresgid 150
151+
#define __NR_setfsuid 151
152+
#define __NR_setfsgid 152
153+
#define __NR_times 153
154+
#define __NR_setpgid 154
155+
#define __NR_getpgid 155
156+
#define __NR_getsid 156
157+
#define __NR_setsid 157
158+
#define __NR_getgroups 158
159+
#define __NR_setgroups 159
160+
#define __NR_uname 160
161+
#define __NR_sethostname 161
162+
#define __NR_setdomainname 162
163+
#define __NR_getrlimit 163
164+
#define __NR_setrlimit 164
165+
#define __NR_getrusage 165
166+
#define __NR_umask 166
167+
#define __NR_prctl 167
168+
#define __NR_getcpu 168
169+
#define __NR_gettimeofday 169
170+
#define __NR_settimeofday 170
171+
#define __NR_adjtimex 171
172+
#define __NR_getpid 172
173+
#define __NR_getppid 173
174+
#define __NR_getuid 174
175+
#define __NR_geteuid 175
176+
#define __NR_getgid 176
177+
#define __NR_getegid 177
178+
#define __NR_gettid 178
179+
#define __NR_sysinfo 179
180+
#define __NR_mq_open 180
181+
#define __NR_mq_unlink 181
182+
#define __NR_mq_timedsend 182
183+
#define __NR_mq_timedreceive 183
184+
#define __NR_mq_notify 184
185+
#define __NR_mq_getsetattr 185
186+
#define __NR_msgget 186
187+
#define __NR_msgctl 187
188+
#define __NR_msgrcv 188
189+
#define __NR_msgsnd 189
190+
#define __NR_semget 190
191+
#define __NR_semctl 191
192+
#define __NR_semtimedop 192
193+
#define __NR_semop 193
194+
#define __NR_shmget 194
195+
#define __NR_shmctl 195
196+
#define __NR_shmat 196
197+
#define __NR_shmdt 197
198+
#define __NR_socket 198
199+
#define __NR_socketpair 199
200+
#define __NR_bind 200
201+
#define __NR_listen 201
202+
#define __NR_accept 202
203+
#define __NR_connect 203
204+
#define __NR_getsockname 204
205+
#define __NR_getpeername 205
206+
#define __NR_sendto 206
207+
#define __NR_recvfrom 207
208+
#define __NR_setsockopt 208
209+
#define __NR_getsockopt 209
210+
#define __NR_shutdown 210
211+
#define __NR_sendmsg 211
212+
#define __NR_recvmsg 212
213+
#define __NR_readahead 213
214+
#define __NR_brk 214
215+
#define __NR_munmap 215
216+
#define __NR_mremap 216
217+
#define __NR_add_key 217
218+
#define __NR_request_key 218
219+
#define __NR_keyctl 219
220+
#define __NR_clone 220
221+
#define __NR_execve 221
222+
#define __NR_mmap 222
223+
#define __NR_fadvise64 223
224+
#define __NR_swapon 224
225+
#define __NR_swapoff 225
226+
#define __NR_mprotect 226
227+
#define __NR_msync 227
228+
#define __NR_mlock 228
229+
#define __NR_munlock 229
230+
#define __NR_mlockall 230
231+
#define __NR_munlockall 231
232+
#define __NR_mincore 232
233+
#define __NR_madvise 233
234+
#define __NR_remap_file_pages 234
235+
#define __NR_mbind 235
236+
#define __NR_get_mempolicy 236
237+
#define __NR_set_mempolicy 237
238+
#define __NR_migrate_pages 238
239+
#define __NR_move_pages 239
240+
#define __NR_rt_tgsigqueueinfo 240
241+
#define __NR_perf_event_open 241
242+
#define __NR_accept4 242
243+
#define __NR_recvmmsg 243
244+
#define __NR_arch_specific_syscall 244
245+
#define __NR_wait4 260
246+
#define __NR_prlimit64 261
247+
#define __NR_fanotify_init 262
248+
#define __NR_fanotify_mark 263
249+
#define __NR_name_to_handle_at 264
250+
#define __NR_open_by_handle_at 265
251+
#define __NR_clock_adjtime 266
252+
#define __NR_syncfs 267
253+
#define __NR_setns 268
254+
#define __NR_sendmmsg 269
255+
#define __NR_process_vm_readv 270
256+
#define __NR_process_vm_writev 271
257+
#define __NR_kcmp 272
258+
#define __NR_finit_module 273
259+
#define __NR_sched_setattr 274
260+
#define __NR_sched_getattr 275
261+
#define __NR_renameat2 276
262+
#define __NR_seccomp 277
263+
#define __NR_getrandom 278
264+
#define __NR_memfd_create 279
265+
#define __NR_bpf 280
266+
#define __NR_execveat 281
267+
#define __NR_userfaultfd 282
268+
#define __NR_membarrier 283
269+
#define __NR_mlock2 284
270+
#define __NR_copy_file_range 285
271+
#define __NR_preadv2 286
272+
#define __NR_pwritev2 287
273+
#define __NR_pkey_mprotect 288
274+
#define __NR_pkey_alloc 289
275+
#define __NR_pkey_free 290
276+
#define __NR_statx 291
277+
#define __NR_io_pgetevents 292
278+
#define __NR_rseq 293
279+
#define __NR_kexec_file_load 294
280+
#define __NR_pidfd_send_signal 424
281+
#define __NR_io_uring_setup 425
282+
#define __NR_io_uring_enter 426
283+
#define __NR_io_uring_register 427
284+
#define __NR_open_tree 428
285+
#define __NR_move_mount 429
286+
#define __NR_fsopen 430
287+
#define __NR_fsconfig 431
288+
#define __NR_fsmount 432
289+
#define __NR_fspick 433
290+
#define __NR_pidfd_open 434
291+
#define __NR_clone3 435
292+
#define __NR_close_range 436
293+
#define __NR_openat2 437
294+
#define __NR_pidfd_getfd 438
295+
#define __NR_faccessat2 439
296+
#define __NR_process_madvise 440
297+
#define __NR_epoll_pwait2 441
298+
#define __NR_mount_setattr 442
299+
#define __NR_landlock_create_ruleset 444
300+
#define __NR_landlock_add_rule 445
301+
#define __NR_landlock_restrict_self 446
302+
303+
#define __NR_sysriscv __NR_arch_specific_syscall
304+
#define __NR_riscv_flush_icache (__NR_sysriscv + 15)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// https://git.musl-libc.org/cgit/musl/plain/arch/riscv64/bits/syscall.h.in
2+
#define __riscv64__
3+
#include <riscv64/syscalls.h>
4+
#include <common.h>

0 commit comments

Comments
 (0)