목록전체 글 (103)
또 뭐하지
풀이#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 read_flag() { system("cat /flag");}int main(int argc, char *argv[]) { char buf[0x80]; initialize(); gets(buf); return 0;}소스코드를 살펴보면 buf 크..
풀이주어진 바이너리를 실행시켜 보면 어떤 값이 나오고 입력을 받는다. 소스코드를 확인해보자. #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[0x80]; initialize(); printf("buf = (%p)\n", buf); s..
풀이// Name: rao.c// Compile: gcc -o rao rao.c -fno-stack-protector -no-pie#include #include void init() { setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0);}void get_shell() { char *cmd = "/bin/sh"; char *args[] = {cmd, NULL}; execve(cmd, args, NULL);}int main() { char buf[0x28]; init(); printf("Input: "); scanf("%s", buf); return 0;}제공된 코드를 살펴보자.buf 크기는 0x28인데 scanf를 통해 입력받는 buf 크기에 제한..
풀이제공된 html 파일에 들어가서 내 생일을 입력해보았다. 아쉽게도 정답이 아니다.6자리 정도면 brute force도 나쁘지 않을 것 같지만 일단 소스코드를 살펴보자. confrim 버튼을 누르면 어떤 일이 발생하는지 요소 버튼을 통해 확인해보니, 입력한 값이 _0x9a220 함수로 넘어가는 것을 확인할 수 있었다.sources 탭을 통해 _0x9a220 함수를 찾아봤는데 하나도 알아볼 수 없었다.그냥 brute force를 하기로 하자.일단 방해가 되는 return alert('Wrong') 부분을 return 0가 되도록 원본 파일을 수정해주었다.for (var y = 0; y 그리고 코드를 작성하여 console 창에 입력했다. 한참 기다린 뒤에야 값이 나왔다. 그리고 화면에 떠있는 flag를 ..
1. Calling Convention함수 호출 규약함수 호출 규약 : 함수의 호출 및 반환에 대한 약속호출자 : 프로그래밍에서 다른 함수 또는 메서드를 호출하는 주체. 쉽게 말해, 호출자는 특정 함수 또는 메서드를 실행하도록 명령한 코드 부분을 가리킴.함수를 호출할 때는 반환된 이후를 위해 호출자의 상태 및 반환 주소를 저장해야함또한, 호출자는 피호출자가 요구하는 인자를 전달해줘야하고, 피호출자의 실행이 종료될 때는 반환값을 전달받아야 함함수 호출 규약의 종류컴파일러는 지원하는 호출 규약 중에서 CPU의 아키텍처에 적합한 것을 선택x86(32bit) 아키텍처 -> 레지스터 수 적음 -> 스택으로 인자 전달하는 규약 사용x86-64 아키텍처 -> 레지스터 수 많음 -> 적은 인자는 레지스터만, 많은 인자..
풀이main 함수이다. sub_140001000 함수를 살펴봐야할 것 같다.함수를 살펴보면 일단 문자열 a1의 길이는 8의 배수여야 한다. 그리고 이 문자열을 8바이트 단위로 sub_1400010A0 함수에 넘겨준다. 이제 sub_1400010A0 함수를 확인해보자.byte_140004020[(unsigned __int8)v5[j] ^ v2]는 v5[j]와 v2를 XOR 연산하고, 그 결과를 인덱스로 사용하여 byte_140004020에서 값을 가져온다. 그 가져온 값을 b라고 할 때 a1[(j+1)%8]과 더한 다음 그 값을 5만큼 right rotate 해준다. 그 값을 다시 a1[(j+1)%8]에 넣어준다ubk_140004000와 byte_140004020 값을 얻어오자. #ubk_140004000..
문제 코드를 살펴보면 scanf("%s",A)에서 입력된 문자열을 변수 'A'에 저장하는데, 이때 길이에 대한 제한이 없다. 따라서 지정된 문자열 길이인 8을 넘기게 되면 변수 'B'의 메모리 영역에 덮어써지게 된다. 이제 어셈블리 코드를 살펴보자. : endbr64 // int main() : push rbp : mov rbp,rsp : sub rsp,0x20 //canary 저장 : mov rax,QWORD PTR fs:0x28 : mov QWORD PTR [rbp-0x8],rax // eax 0으로 초기화 : xor eax,eax // 지역 변수 'A' 초기화, 입력을 받아 'A'에 저장 ..
1. PwnablePwnable(시스템 해킹)운영체제 또는 프로그램 취약점을 찾아 공격하고, 관리자의 권한 등을 얻어 시스템을 장악하거나 의도치 않은 행동을 하게 하는 것컴퓨터 프로그램의 행위를 조작하여 공격자가 원하는 행동을 실행하도록 하는 공격궁극적으로 관리자 권한 탈취가 공격의 목표취약점 종류Memory Corruption : Buffer Overflow, Out-Of-Boundary, Off-by-one, Format String Bug, Double Free/User-After-FreeLogical Bug : Command Injection, Race Condition, Path Traversal(경로 탐색)해킹 과정취약점 발견 -> 공격 시나리오 작성 -> 필요 정보 수집 및 공격 -> 권한 ..