목록Hacking/Dremahack 문제풀이 (12)
미역줄기의 이모저모

오랜만입니다. 개강했다고 정신줄 놓고 있다가 이대로면 해킹은 개뿔 똥멍청이가 될 것 같아서 다시 정신차리고 돌아왔습니다. 간만에 푸는 워게임이기 때문에 아주 쉬운 문제로다가 풀었습니다. 시스템 해킹을 시작하고 거의 처음으로 온전히 제 힘으로 flag를 찾은 문제입니다 ㅎㅎ.. 근데 정말 EZ함문제 설명문제 코드#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); al..

보호 기법 & 문제 코드 amd64 아키텍처 -> sfp는 8바이트겠군 canary 없음 -> sfp랑 ret 아무렇게나 덮어써도 괜찮다. NX 적용됨 -> 셸코드 사용 어렵 PIE -> 바이너리가 실행되는 메모리 주소가 랜덤화 // Name: fsb_overwrite.c // Compile: gcc -o fsb_overwrite fsb_overwrite.c #include #include #include void get_string(char *buf, size_t size) { ssize_t i = read(0, buf, size); if (i == -1) { perror("read"); exit(1); } if (i 0 && buf[i - 1] == '\n') i--;..

문제 & 보호기법 amd64 아키텍처 -> 카나리가 8바이트 NX enabled -> 셸 코드 사용 못함 문제 코드 #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]..

oob 문제이다 보호 기법 i386 아키텍쳐 , 32비트 -> canary는 4바이트 canary 있다 -> SFP, RET 마음대로 변경 불가 NX enabled 적용 -> 셸코드불가, rop 이용 No PIE -> 바이너리가 실행되는 메모리 주소가 랜덤화하지 않다. 데이터 영역의 변수들은 항상 정해진 주소에 할당된다. 코드 분석 #include #include #include #include #include char name[16]; char *command[10] = { "cat", "ls", "id", "ps", "file ./oob" }; void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, ..

문제 코드 #include #include #include int main() { char buf[0x30]; unsigned long long *addr; unsigned long long value; setvbuf(stdin, 0, _IONBF, 0); setvbuf(stdout, 0, _IONBF, 0); puts("[1] Stack buffer overflow"); printf("Buf: "); read(0, buf, 0x100); printf("Buf: %s\n", buf); puts("[2] Arbitrary-Address-Write"); printf("To write: "); scanf("%llu", &addr); printf("With: "); scanf("%llu", &value); pr..

문제설명 코드 분석 #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); } int main(int argc, char *argv[]) { char buf[0x40] = {}; initialize(); read(0, buf, 0x400); write(1, buf, sizeof(buf)); return 0; } char형 버퍼에 0x40 만큼 할당했다. read를 보면 버퍼..

문제 설명 본격 적인 분석 전에 checksec으로 보호기법을 확인한다. x86-64 아키텍처. canary가 없다. NX가 적용되었다. PIE 없다. canary가 없다 == SFP, ret와 그 뒷 주소를 마음대로 변경해도 프로세스 종료가 안 된다! NX 걸려있다 == 셸코드 사용이 어렵다 == return oriented programming 기법을 사용하자!PIE가 적용되지 않았다 == 바이너리가 실행되는 메모리 주소가 랜덤화하지 않는다. 코드 분석 #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0)..

ROP(Return Oriented Programming) ASLR이 걸린 환경에서 system 함수를 사용하려면 프로세스에서 libc가 매핑된 주소를 찾고, 그 주소로부터 system 함수의 오프셋을 이용하여 함수의 주소를 계산해야한다. ROP는 리턴 가젯을 사용하여 복잡한 실행 흐름을 구현하는 기법이다. ROP 페이로드는 리턴 가젯으로 구성되는데, ret 단위로 여러 코드가 연쇄적으로 실행되는 모습에서 ROP chain이라고 불린다. 페이로드 작성 과정을 보면,, chain이라고 한 이유가 다 있다.... 문제 들어가기 전 복습 1. plt에는 got 엔트리의 주소가 적혀있고 got에는 해당 함수의 실제 주소가 적혀있다. 2. ASLR이 적용되면 실행할 때마다 스택, 힙, libc_base의 주소가 ..