전체 글

하고 싶은게 많은 사람입니다. 게임 개발도 하고 싶고 보안 공부도 하고싶어요 앱개발도...
먼저 4번 write up 이다. 다음과 같은 쿼리를 통해서 pw를 맞추어야 하는 것 같다. Error based 라는 점을 알아내서 비밀번호 길이를 얻어냈다. 비밀번호는 13자이다. 이를 이용해서 password를 전부 때려 맞추겠다. password를 알아냈다. 일단은 이게 맞는지는 모르겠지만 풀었다고 하니 맞는 것 같다. 3번 write up 이다. 몇가지 테스트 결과 benchmark , sleep, #이 막혀있다는 것을 알 수 있었다. 그런데 #은 --으로도 대체가 가능하니까 상관없는데 문제는 sleep 계열이다. 다 막혀서 heavy query를 사용해주기로 했다. 이렇게 pw길이는 12라는 것을 알아냈고 브루트포싱 하면 된다. 아래코드를 작성했다. timeout 을 이용해서 진행하였다. 저 ..
Maris Shop이라는 문제를 어쩌다가 풀게되었다. 사진은 그냥 뭔가 이름이랑 어울려보여서 가지고 왔다. 보안기법은 위 사진과 같고 환경은 Ubuntu 16.04 이다. 바이너리 분석을 먼저 해보겠다. 크게 add, show, remove, buy가 있다. Add int add() { unsigned int i; // [rsp+4h] [rbp-Ch] unsigned int j; // [rsp+4h] [rbp-Ch] unsigned __int64 idx; // [rsp+8h] [rbp-8h] sub_1188(); printf("Which item?:"); idx = read_long(); if ( idx > 6 || !idx ) // idx=0 or idx>=7 return puts("No such it..
starbound 문제의 writeup 이다. 보호기법은 다음 사진과 같다. 이 문제는 매우 크고 방대하기 때문에 자세한 분석은 하지 않았다. 세세한 기능은 파악하지 않고 취약점만 찾았다. 취약점 int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax char nptr; // [esp+10h] [ebp-104h] init(); while ( 1 ) { alarm(0x3Cu); dword_805817C(); if ( !readn(&nptr, 0x100u) ) break; v3 = strtol(&nptr, 0, 10); if ( !v3 ) break; ((void (*)(void))dword_8058154[v3])()..
예전에 상당히 재미있게 봤었었는데.. ㅎㅎ 문제는 간단하다. 딱히 분석은 없다. 너무 단순해서 NX가 없고, got부분을 네가 작성하는 쉘코드의 주소로 덮어쓸 수 있다. 따라서 내가 작성한 쉘코드를 실행하는 문제이다. 중간에 글 쓰다가 날라갔다. 이 문제는 나에게 있어서 나쁜 기억만 심어주었다. 당연히 char*str={"/bin/sh",0}; execve(str[0],str,0); 으로 쉘코드 작성하면 될줄 알았는데 32bit에서는 execve("/bin/sh",0,0) 이다. 너무 짜증나니까 내 코드를 가져가세요 from pwn import* p=process('./death_note') context(os="linux",arch="i386") p=remote('chall.pwnable.tw',102..
Level 1 매우 간단한 XSS 문제이다. alert을 띄우는 것이 목표인데, 아무런 검증을 하지 않아서 를 해주면 '1'이 알림창으로 뜬다. Level 2 이번에는 태그가 필터링 되어서 OnClick 핸들러를 이용했다. 버튼을 만들어서 핸들러를 달아주었다. 눌러 Level 3 코드를 보고 취약점을 찾을 수 있었다. SQL Injection 비슷하게 작동하는 것 같다. 인자로 1.jpg"' OnClick="alert('1')"/> 를 주어서 html 변수가 만드는 img 에 OnClick 핸들러를 넣어주었다. Level 4 startTimer 에 들어가는 변수인 timer의 내용을 우리 마음대로 주무를 수 있다. 그래서 화면에 나와있는 것 같이 인자를 구성해서 보냈다. 그런데 ; 를 쓸 때 sql in..
glibc 2.26 버전 이상부터 사용가능한 방법같다. 이미 누군가 찾았을 것 같긴 한데... 나는 모른다. malloc분석을 하다 발견했다. 이 방법은 tcache가 꽉차서 smallbin을 사용하다가 tcache가 비워지는 경우, smallbin에 free된 청크가 3개 있을때(이 이상도 될듯), 중간에 있는 청크의 bk를 변조가능하면 원하는 fake chunk를 tcache에 넣을 수 있다. (단, bk를 실제 smallbin에 들어간 청크로 맞추어 주어야함) if (tcache && tc_idx counts[tc_idx] < mp_.tcache_count //해당 tcache에 자리에 있으면, s..
생각보다 코드가 그렇게 길지는 않다. sysmalloc은 나중에 다룰 함수인데, 처음 할당을 받을 때 heap의 주소를 결정해주는 함수 이다. (initialize) 아무래도 다중아레나의 경우 사용되는 remove fb 같은 함수들은 뭔지 잘 모르겠어서 찾아봐야겠다. static void* _int_malloc(mstate av, size_t bytes) { INTERNAL_SIZE_T nb; /* 패딩처리된 사이즈 */ unsigned int idx; /* 인접한 bin의 인덱스 */ mbinptr bin; /* 인접한 bin */ mchunkptr victim; INTERNAL_SIZE_T size; int victim_index; mchunkptr remainder; /* 분할되고 남은 청크 */ ..
드디어 malloc의 분석을 시작해본다. tcache 2 가 적용된 최신 버전의 libc로 분석을 한다. 기본적으로 설명은 어느정도 malloc의 동작 원리에 대해 알고있다는 가정하에 설명할 생각이다. Arena 먼저 간단하게 집고 넘어가야 할 것이 있다. 바로 Arena에 관해서이다. Arena는 스레드당 할당된 heap 부분을 관리하는 곳 이라고 할 수 있다. 그래서 메인스레드에서 할당되었으면 main arena라고 부르는 것이다. 아마도 이는 속도 때문이라고 생각한다. 분석하면서도 atomic 계산의 정확도에 대한 말이 나오는 것 보면 동기화 관련한 문제 때문인 것 같다. 그러나 스레드가 많아지게 되면 공간적인 낭비가 이루어지게 때문에 최대로 할당받는 아레나의 수는 64bit에서는 8*core 개수..
OSOR2
Osori Development Studio