문제 파악./prob처음 실행해보면 문자열을 입력 받는거같은데, 조금 이상하다. 뭔가 문자열 혹은 버퍼가 깔끔하게 들어가고 있는 느낌은 아니다. 카나리 없고, PIE 없다. 개꿀. IDA처음 실행하면 16바이트를 입력받고, s1이 Decision2Solve와 같은지 비교한다. read_input은 1바이트씩 반복문을 통해 입력을 받는다.이걸 보고 알 수 있는건, 처음 실행했을 때 이상하게 문자열이 들어가는 느낌이 이것 때문이라는 것을 알 수 있다. 버퍼에 남아있는 값들이 다음 입력으로 넘어가거나,,, 엔터까지 받아버리고 등등,,, 취약점unsafe_func()을 보면 너무 당당하게 bof가 발생하고 있다. 근데 보자마자 조금 쎄한건 0x10000만큼이나 받아버리면... 정상 실행이 가능할까...? 우선 ..
안녕하십니까. barrack입니다. 먼저 그동안의 글을 읽어봤는데 틀린 정보도 있더라구요. 당시에는 맞다고 생각했던 정보들이 이제와서 보니 부족함이 많았다는 생각에 글을 쓰는게 좀 무서워졌었습니다.(누군가가 가짜 정보를 믿게 되지 않을까...) 그렇다고 블로그 쓰는걸 멈추긴 싫어서 경고 아닌 경고를... 해두려고요ㅎ 😊해당 블로그의 글은 barrack이 공부하며 적는 글입니다. 틀린 정보가 있을 수 있으니 모든 글을 정답으로 받아들이지 마시고, 만약 정확한 정보를 아시는 분이 계시다면 댓글로 알려주세요😊 그렇습니다. 이제 Hook overwrite 시작할까요...(매 블로그마다 반말과 존댓말을 넘나드는 사람) HookHook Overwrite을 하려면 Hook이 뭔지부터 알아야 하지 않을까요? 아래..
문제 분석 pwnable.kr을 풀기 전에 문제에 있는 힌트를 괜히 주는게 아니라고 생각이 든다. 위 힌트에서 bash에 대한 shocking news가 있다고 한다. 따라서 문제 이름인 shellshock, bashshock에 대해 검색을 해보았다. Shellshock(CVE-2014-6271) Shelllshock 취약점은 GNU bash shell에서 환경변수(env)를 통해 공격자가 원격으로 명령어를 실행할 수 있는 취약점이다. 내가 이해한 바로는 해당 취약점은 특정 bash 버전에서 발생한다. 새로운 bash 쉘을 떨어뜨리는 기능을 수행하거나, 쉘을 생성하는 링크가 있을 때 사용 가능하다. 환경변수의 함수 선언을 통해 의도치 않은 동작을 수행시킨다. 환경 변수의 함수 선언 쉘에서 export 명..
ARM을 공부하라고 한다. 먼저 leg.c와 leg.asm 파일을 다운받았다. 소스코드 분석 leg.c #include #include int key1(){ asm("mov r3, pc\n"); } int key2(){ asm( "push {r6}\n" "add r6, pc, $1\n" "bx r6\n" ".code 16\n" "mov r3, pc\n" "add r3, $0x4\n" "push {r3}\n" "pop {pc}\n" ".code 32\n" "pop {r6}\n" ); } int key3(){ asm("mov r3, lr\n"); } int main(){ int key=0; printf("Daddy has very strong arm! : "); scanf("%d", &key); if( (k..
참고 자료 KISA 보호나라&KrCERT/CC KISA 보호나라&KrCERT/CC www.krcert.or.kr KISA의 2023 하반기 사이버 위협 동향 보고서를 읽어보았다. 관련 보고서에 대해선 처음 읽어보는 것이였지만 읽고 정리 포스팅을 작성해보고자 한다. 3가지 파트로 나누어져 있었다. 1. Trend 2. Insights 3. Techniques 이번 포스팅에서는 Trend 파트에 대해 전반적 요약을 해보려고 한다. (해당 포스팅의 이미지 및 정보는 KISA 보호나라&KrCERT/CC 의 정보를 기반으로 합니다) 목차 Trend 침해사고 현황 IoT 봇넷 위협 동향 보안 취약점 및 신고포상제 동향 라자루스(Lazarus) 공격 그룹의 특징 1. 침해사고 현황 전체 침해사고 신고 통계 한눈에 봐..
소스코드 기능분석 먼저 main 함수에서 putenv함수로 환경변수를 설정한다. 이때 PATH가 /thankyouverymuch로 바뀌게 된다. 이후 filter 함수에 cmd1 파일을 실행할 때 넘겨준 인자가 넘어가게 되고, strstr에 의해 필터링을 하게된다. 인자에 flag, sh, tmp가 없었다면 system(넘겨준인자)를 실행한다. 익스플로잇 먼저 putenv로 path를 없앤다. printenv로 환경변수를 확인해보면 PATH가 이렇게 설정되어있다. /usr/bin이 기본 path이기에 cat과 같은 명령어를 cat만 쳐도 실행이 되는 것이다. 하지만 path가 사라졌으니 절대 경로를 사용해야한다. 즉 인자로 /bin/원하는 명령 을 넘겨주어야 하는 것이다. 우리가 하고싶은건 flag를 읽..
passcode.c #include #include void login(){ int passcode1; int passcode2; printf("enter passcode1 : "); scanf("%d", passcode1); fflush(stdin); // ha! mommy told me that 32bit is vulnerable to bruteforcing :) printf("enter passcode2 : "); scanf("%d", passcode2); printf("checking...\n"); if(passcode1==338150 && passcode2==13371337){ printf("Login OK!\n"); system("/bin/cat flag"); } else{ printf("Lo..
#include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void get_shell() { system("/bin/sh"); } void print_box(unsigned char *box, int idx) { printf("Element of index %d is : %02x\n", idx, box[idx]); } void menu() { puts("[F]ill the ..
#include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void get_shell() { system("/bin/sh"); } int main(int argc, char *argv[]) { long addr; long value; char buf[0x40] = {}; initialize(); read(0, buf, 0x80); printf("Addr : "); scanf..