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;
}
소스코드 분석 - asm.c - sandbox
void sandbox(){
scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL); //필터 규칙과 일치하는 Syscall 호출 시 커널에 의해 종료됨(초기화)
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);
//open, read, write, exit 함수 호출 가능
if (seccomp_load(ctx) < 0){ //설정한 필터 규칙을 커널에 로드해 필터 활성화(필터 규칙 활성화)
seccomp_release(ctx); //필터 상태를 해제하고 연관된 메모리 해제(필터 규칙 해제)
printf("seccomp error\\n");
exit(0);
}
seccomp_release(ctx);
}
seccomp으로 특정 시스템 콜만 사용할 수 있도록 필터링 작업을 수행하고 있음
shellcode 실행 전 sandbox에서 필터링 됨
소스코드 분석 - asm.c - main
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;
}
A police unit intercepted a message from a terrorist group. This message may contain a secret key used to encrypt other communications. They need you to decrypt it !
[풀이]
문제에서 주어진 파일이 ppm 확장자를 갖고 있어서 gimp 로 열어 보았더니 다음과 같은 사진을 볼 수 있었다.
사진에서는 flag로 유추되는 값을 볼 수 없었고, 파일의 hex 값과 strings 값을 확인하면서 pass에 대한 hint를 얻을 수 있었다.
문제에서 "a language where the programs are works of modern art’’라고 얘기했는데, 관련하여 검색해보니 piet esoteric programming 이라는 기법이 있었다.
You attend an interview for a forensic investigator job and they give you a challenge to solve as quickly as possible (having the Internet).They ask you to find the date of printing as well as the serial number of the printer in this document.You remain dubitative and accept the challenge.
The answer is in the form:
hh:mm dd/mm/yyyy SSSSSSSSwith
hh: the hour of the event mm: the minutes of the event dd: the day of the event MM: the month of the event yyyy: the year of the event SSSSSSSS: the serial number
[풀이]
문제 파일을 확인했을 때 풀이를 위해 얻을 수 있는 hint는 없다.
yellow dot이라고 구글에 검색해보면 컬러 프린터 출력물 속에 노란 점들을 삽입해서 데이터를 숨겨 놓는 기법인 것을 알 수 있다. yellow dot을 찾기 위해서 방법들을 검색해보니 yellow dot을 확인하려면 배경을 파란색 계열로 바꿔주거나 복사 스캐너를 통해서 확인할 수 있다고 한다.
이에 우분투에서 convert 명령으로 배경을 파란색으로 변경하니 아무것도 확인할 수 없다. 포토샵 프로그램으로도 확인할 수 있다고 그랬는데 gimp로 변경해봐도 yellow dot을 찾아볼 수 없었다.
포렌식에 주로 사용되는 online 사이트들을 찾아서 이용하니 yellow dot을 확인할 수 있었다.
가로 세로 검은선 안에 있는 yellow dot으로 날짜, 시간, 시리얼 값을 표현할 수 있고, 가로 줄은 사진과 같이 시간(2~5), 날짜(6~8), 구분자(10), 시리얼(11~14)로 구분한다. 각각의 값은 세로줄에 의해 결정 되고 세로줄의 각 칸은 2^n 형태로 나타난다.
사진의 2번을 예로 설명하자면, yellow dot이 32, 16, 2에 찍혀있는데 이 값들을 모두 더하면 50이다. 즉, 시간에서의 50분을 2번의 yellow dot으로 표현한 것이다. 이런식으로 yellow dot이 위치한 곳의 값들을 더해보면 날짜, 시간, 시리얼 값을 구할 수 있다.
다시 문제로 돌아와서 위의 예시 사진처럼 바꿔보면!
이렇게 나타낼 수 있고
각각의 값들을 더해보면 5 11 27 7 14 30 29 92 6 이다.
이 값들을 영역에 맞게 나눠서 최종적으로 정리해보면 11:05, 2014-07-27, 06922930임을 알 수 있다.
이것을 문제에서 제시한 형태로 작성하여 인증해주면 문제를 해결할 수 있다.
Issue
💡https://web.archive.org/web/20180305181029/https://w2.eff.org/Privacy/printers/docucolor/에서 yellow dot 해독을 할 수 있다고 하는데 나만 그런지는 모르겠지만 해독을 안해준다👿
정답 인증 후에 풀이를 보니 코드를 작성해서 구할 수 있다고 하는데 코드는 이해 못하겠다☹️