목록분류 전체보기 (109)
Sechack
main함수이다. add, edit, delete, check, exit 5개의 함수가 각각 메뉴마다 동작하는것같다. menu함수이다. s변수를 출력하길래 따라가봤더니 유니코드 형태로 나온다. 실행시켜보면 s변수는 한글인것을 알 수 있다. 그래서 IDA에서 유니코드 형태로 보인것이었다. 참고로 바이너리 이름도 한글인데 영어로 바꾸고 풀이를 진행하였다. add함수이다. smooth함수는 안에 들어가보니까 32byte를 입력받고 atoi를 이용해서 정수로 변환 후에 반환하는 함수이다. index, size, menu를 입력받을때 사용된다. 당연한 얘기지만 저 함수 내부에서 BOF따위는 터지지 않는다. 본론으로 돌아와서 add함수는 index, size, data를 입력받고 index가 0과 같거나 크고 6보..
nc서버 하나 주길래 접속해보니까 3개의 메뉴가 있다. 1번을 선택해보니까 간단한 사칙연산이 나온다. 계산기로 계산하고 보내보니까 1차 침공 성공이라면서 2차 침공을 하라고 또다시 수식을 준다. 사칙연산 노가다 문제로 추측해볼 수 있다. 3개의 메뉴 전부 봤는데 전부 계산 노가다였다. 그래서 바로 pwntools를 이용해서 자동화 스크립트 짜줬다. from pwn import * def parser(data): if b"+" in data: arr = data.split(b"+") first = int(arr[0]) second = int(arr[1]) r.sendlineafter(": ", str(first + second)) elif b"-" in data: arr = data.split(b"-") ..
void __fastcall __noreturn main(__int64 a1, char **a2, char **a3) { int v3; // eax sub_400846(); while ( 1 ) { sub_4008DA(); v3 = (char)sub_4008A7(); switch ( v3 ) { case 50: sub_40097F(); break; case 51: sub_4009DD(); break; case 49: sub_400910(); break; } } } IDA로 까봤는데 stripped가 걸려있다. 그래도 바이너리가 워낙 간단해서 분석하는데 어려움은 없었다. int sub_4008DA() { puts("1. make wish"); puts("2. view wish"); return puts("..
ASLR로 인해서 stack, heap, libc의 base주소가 프로그램 실행할때마다 매번 변한다. 따라서 우리는 libc를 이용해서 exploit하려면 취약점을 이용해서 libc주소를 leak하고 적절한 offset연산을 거쳐서 base주소를 구해야 한다. libc를 leak하는데는 여러가지 방법이 있다. 가장 일반적이고 떠올리기 쉬운건 fsb가 터질때 %p를 이용해서 leak하거나 bof가 터질때 rop chain으로 puts, write와 같은 출력함수들을 이용해서 함수 got와 같은 libc주소를 담고 있는 메모리 공간을 출력해주는 것이다. 아니면 스택에 libc주소가 정리 안되고 남아있을수가 있다. printf같은 함수는 NULL을 만나기 전까지 출력해주므로 스택에 libc나 stack주소가 ..
IDA로 보면 굉장히 심플하다. 문제 이름앞에 baby가 붙어있으면 대부분 매우 어려워서 이번문제에는 어떤 hard한 요소가 있을까 하고 봤는데 진짜 간단한 fsb였다. babyheap도 그렇고 HackCTF만 baby붙은게 진짜 쉽다. checksec으로 보호기법 보기 전까지 full relro면 어떡하나 바짝 긴장했었다. baby라는 이름이 나를 긴장하게 만든다... 다행히도 Partial이다. 이러면 got overwrite가 가능하다. 문제는 1번 입력받고 프로그램이 바로 꺼진다는거였는데 read함수에서 카나리를 변조할 수가 있으므로 이건 간단하게 __stack_chk_fail함수 got를 main으로 덮어서 해결 가능하다. got에는 맨처음에 plt+6의 주소가 들어가고 그다음부터 libc에 매..
앞에 3문제는 그냥 기초적인 rop라서 딱히 적을게 없는데 이문제는 함수의 특성을 제대로 고려하지 못해서 많은시간 삽질한 문제라서 풀이 남깁니다... int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { __int64 v3; // rdx __int64 v4; // rdx int v5; // ST0C_4 signed int v6; // [rsp-160h] [rbp-160h] __int64 v7; // [rsp-158h] [rbp-158h] __int64 v8; // [rsp-150h] [rbp-150h] const char *v9; // [rsp-148h] [rbp-148h] __int64 (__fastcall **v10..
키야 ~~~~~~ 처음으로 퍼블먹어본 문제이다. 첫 퍼블과 동시에 처음으로 CTF에서 처음으로 포너블 올클해봤다. 쾌감... 일단 이문제 취약점은 off by one이다. 이거 알아내기까지 은근 삽질 많이했다. main을 보니까 메뉴를 선택해서 해당 역할을 수행하는것같다. 실행해보자. 대충 이렇습니다. 이제 각자 메뉴가 어떤일을 하는지 분석해봅시다. 먼저 1번 메뉴이다. 여기서 off by one이 터진다. 하지만 캐치해내기까지 꽤 걸렸다. 이부분은 이따가 3번 메뉴를 보면 off by one이 어떻게 익스플로잇과 연계되는지 알 수 있다. 저거 캐치한뒤에는 거의 10분안에 플래그 얻은것같다. 저기서 눈여겨봐야하는 부분이 qword_6020C0[i] 이부분과 qword_602120[i] = 32LL; 이부..
처음에 숫자를 입력받는다. 그리고 입력받은 숫자를 기반으로 다음 입력때 사용할 스택 주소를 연산하는것 같았다. 그리고 연산된 주소에다가 0x78만큼 입력받는다. 연산하는 부분을 어셈으로 보면 덧셈, 뺄셈, 곱셈, 시프트 연산 등을 하는걸 볼 수 있다. 우리는 연산된 주소와 ret까지의 offset이 0x78을 넘지 않도록 만들면 된다. 저걸 다 분석할수도 있지만 귀찮아서 그냥 -1넣어봤다. 그리고 gdb로 보니까 ret까지의 offset이 0x28이 나오는것이다. 그래서 그냥 -1넣고 진행하였다. 옆에보면 pop rax, rdi, rsi. rdx, syscall 전부 가젯을 제공해주는걸 알 수 있다. 따라서 저걸 사용해서 sysrop해서 /bin/sh기록하고 execve호출하면 되는것이다. 보니까 bss..
처음으로 풀어본 CTF힙문제이다. 고득점 문제여서 풀고나서 매우 뿌듯했다. 프로그램은 매우 간단했다. 원하는 사이즈로 청크를 할당받을 수 있고 해제할 수 있다. add함수는 전역변수에 우리가 입력한 사이즈만큼 malloc을 한다. view함수는 전역변수에 들어있는 값을 출력해주고 있었다. delete 함수는 전역변수를 free해준다, PS: The challenge uses the good old Ubuntu 18.04 libc ;) 문제에서도 이렇게 힌트를 주면서 double free가 그냥 된다는것을 알려주고 있다. 실제로 double free에 대한 검증이 없는 libc였다. 근데 full relro가 걸려있었다. 역시 호락호락하게 풀리게 주진 않는다... got overwrite가 불가능하니 fr..
톡방이나 커뮤니티같은 곳에 있다보면 입문자 분들이 공통적으로 가장 많이 질문하시는 내용이기도 하고 저 또한 드림핵이라는 플랫폼을 알기 전까지 이것저것 삽질한 기억이 나서 글을 쓰게 되었습니다. 사실 보안에 입문하려면 프로그래밍 지식과 기초적인 컴퓨터 사이언스 지식은 베이스로 가져가야 합니다. 저는 입문하시려는 분들께 최소한 C, Python은 배우고 입문하라고 말하고 싶습니다. 해킹에는 크게 5가지 종류가 있습니다. 웹해킹, 리버싱, 포너블, 포렌식, 암호학(크립토)이라고 생각합니다. 그중에서 가장 대중적인 분야는 웹해킹, 리버싱, 포너블 이렇게 3가지인것 같습니다. 실제로 많은 입문자분들이 관심가지시는 분야는 웹해킹인것 같습니다. 이제 이 3가지 분야에 대한 공부 방법을 소개하여 보겠습니다. 먼저 웹해..