본문 바로가기

shayete

[2014 화이트햇 콘테스트]Cold War 이번에 ctf풀면서 스터디하자! 하고 만들어진 Mr.Mr 팀입니다.어쩌다보니 예선 일반부 9위까지 올라가게 됬네요.문제풀이 시작하겠습니다. 주어진 건 이 소스코드와(아. if __name__ = "__main__":a = g(8) 에서 8이 아니라 n으로 주어졌습니다. 죄송합니다.) fee304acd551a17fbd3b7f23c1e51fba9c55a93de43d797187fc1eaa9055ba74fc3e2c62d4ac10fe864fbb79f83c7822 f0e414aa9d5ebc3df2202c6dc8f85197d54caf6ebd267971c9e51fb9d54fa678bd226d64c2ff51aa9a5faf64bd332c60c6e014b0915abc3df4212c64c8e51fb9d554b878ef732d.. 더보기
stack corruption basic 요즘은 Buffer Overflow 라는 표현보다 Stack corruption, Heap Corruption이라는 표현을 쓰더라구요. 저도 트랜드(?)에 맞춰서 스택커럽션이라는 표현을 쓰도록 할게요. 시스템 포스팅을 시작하기에 앞서 시스템 해킹이 뭔지 알아보겠습니다. 우선, 간단하게 취약한 코드를 코딩합니다. 환경은 공지사항에도 올려놨듯이, ubuntu 14.04, 커널환경은 linux 3.13.0-36-generic 입니다. 컴파일 옵션에 -fno-stack-protector, mpreferred-stack-boundary=2 옵션을 주었는데 -fno-stack-protector 를 걸면 컴파일된 프로그램에 메모리보호기법인 ssp(stack-smashing-protector) 를 걸지 않습니다. 카나.. 더보기
[Linux] vim colorscheme 설정 이번엔 vim 환경에서 컬러 설정하는 방법을 알려드리겠습니다. 제가 쓰는 colorscheme 은 colorscheme_template 입니다. 설정하는 방법을 알려드리겠습니다. 우선 colorscheme vim 파일을 받아야하는데, https://code.google.com/p/vimcolorschemetest/ 여기에 들어가시면 맨 밑에 C Java Perl 등등 여러가지가 있을겁니다. C 로 들어가서 여러분이 원하는 vim을 받으시면 됩니다.(혹시 다운로드가 되지 않는다면 거기 텍스트를 긁어서 아무곳에나 붙이고 파일을 .vim으로 만드시면 됩니다.) 저기 url 외에도 vim colorscheme을 검색하시면 여러가지 자료를 받으실 수 있습니다. 원하는 파일을 받고 리눅스 바탕화면에 둡니다. fin.. 더보기
[Linux] gdbinit 설정 Fuzzer를 돌리는 동안 짬나는 시간에 포스팅해봅니다. 오늘은 gdbinit과 vim 컬러 설정에 대해 알려드릴게요. gdbinit은 gdb를 실행시킬 때에 사용자의 편의에 맞게 인터페이스를 구성했습니다. r로 진행시키고 c, n, s, ni, si 로 디버깅을 진행할 때마다 위처럼 레지스터가 보이고 레지스터 값이 변한다면 빨간색으로표시가 되어서 디버깅을 할 때에 편리합니다. 이걸 설정하는 방법을 알려드리겠습니다. 우선 http://reverse.put.as/2012/04/13/gdbinit-v8-0-simultaneous-support-for-x86x86_64-and-arm-architectures/ 이 사이트로 가서 gdbinit8.gz 를 다운받습니다. 그 후, 압축을 해제하면 gdbinit8 파.. 더보기
Assembly-> C Handray(2) Assembly-> C Handray(1)에서 했던 내용을 약간 응용해서 Codegate 2013 vuln 400 문제를 handray 할텐데요.assembly언어를 C로 handray하는 건 끈기와 인내(?)가 필요한 작업이기 때문에 일부분만 하겠습니다. 이전 글을 읽으시고 핸드레이를 연습하시는 분이라면 이 글은 어셈블리어가 눈에 익숙해지신 분들만 읽어주셨으면 좋겠습니다. 코드가 너무 길어서 일일히 설명해드릴 수가 없고(어차피 노가다이기 때문에 핸드레이 좀 해보신 분들은 이해하실 수 있을겁니다.) Ida의 힘을 빌려 함수와 변수명을 정의하는 과정을 보여드립니다. 일단 이 문제는 이렇게 생겼습니다. 핸드레이에 익숙하신 분은 Ida-pro를 이용해서 코드분석을 빨리 하시는 것도 좋은 방법이지만, 배우는 입.. 더보기
Assembly-> C Handray(1) 시스템해킹, 리버싱을 시작하기에 앞서, 어셈을 C로 바꾸고 C를 어셈으로 바꿀 수 있는 능력은 정말 중요하다고 생각합니다. 리버싱이든 시스템이든 우리는 어셈블리어를 무조건 마주치고 분석해야하는 입장이기 때문입니다.(물론 안드로이드 리버싱을 할 때에는 달빅코드로 되어있어서 어셈블리어와는 약간 다른 개념이지만요.) 문제를 많이 풀어보는 것도 좋은데 전 그전에 C언어로 어떤 코드든 컴파일해서 그걸 디버거로 역분석하여 핸드레이로 다시 복원하는 연습을 하셨으면 좋겠다고 생각합니다. 짧게는 한달, 많게는 두달까지요. 이 기준은 여러분이 적당하다고 느낄때까지 입니다. 복원하는 연습을 꾸준히 하다보면 어셈블리어코드가 자연스레 눈에 들어오는데, 그정도면 성공입니다. 예를 들어서, 간단한 코드가 있는데 gdb로 열어보면 .. 더보기
5. *p와 p[]의 차이. *p와 p[]의 차이를 설명하기에 앞서 간단한 코드를 보여드리겠습니다. 1번은 배열을 이용해서 각각 *(a + 2), a[2], 2[a]를 출력하고 있고 2번은 char형 포인터에서 b[2]에 해당하는 값을 출력하는 겁니다. 각각 어떤 값이 출력될까요? 1번 여러분이 아시는 a[2]는 당연히 3이 출력되겠죠. 그렇다면 2[a]와 *(a + 2)는 어떤 값이 출력이 될까요? 똑같이 3, 3이 출력이 됩니다. 여기서 눈치가 조금 빠르신분은 대충 아셨겠지만 a[2]는 배열이 아닙니다. 포인터 변수를 배열처럼 사용했을 뿐. a[2]의 의미는 a에서 2만큼 더 떨어진 곳의 값을 지칭합니다. 그래서 *(a + 2) == a[2]는 같은 표현이죠. 그렇다면 2[a]는 무슨 뜻일까요. C언어에서 []는 연산자를 나타냅.. 더보기
4. sha == sha[0] == &sha[0][0] 3. 배열포인터에서 int sha[3][2]; int (*psha)[2]; psha = sha일 때 배열 sha는 배열의 첫번째 주소를 가리킨다고 했었습니다. 그렇다면 sha == sha[0] == &sha[0][0] 이건 맞는 문장일까요? 맞는 문장이네요. 하지만 주소만 보고 정말 저 문장이 똑같다고 할 수 있을까요. sha는 전체 배열을 뜻하고 sha[0]은 0행 전체를, sha[0][0]은 [0][0] 하나를 가리키고 있습니다. 그래서 sha는 3 x 2 x 4 인 24가 나오고 sha[0]은 2 x 4 sha[0][0]은 4가 나옵니다. 이로써 sha == sha[0] == &sha[0][0] 는 가리키는 주소만 같을 뿐 완전히 다르다는 걸 알게 됬습니다. 더보기
3. 배열포인터, 이젠 아무대나 *쓰지말자! *의 두가지 의미를 설명했을 때, 제일 중요했던 건 1. 초기값을 지정해줄 때의 *는 번지를 가르키는 걸 뜻했고 2. 수식에서의 *는 포인터변수가 가르키는 주소의 값을 리턴한다고 했습니다. 이 두가지는 포인터를 하시면서 반드시 기억해주세요. 오늘은 배열포인터에 대해 글을 쓸게요. 우선, 배열이 뭘까요. 여러분도 다 아시듯 array[3] = {1, 2, 3} 이런식으로 변수 여러개를 편리하게 지정할 수 있죠. 그렇다면 배열의 포인터는? 배열 포인터변수에 배열의 주소값을 넣게 될 경우, 배열의 첫번째 번지를 가르키게 됩니다. array[3]이라면 array[0]을 가르킬 것이고 array[2][3]이라면 array[0][0]을 가르키겠죠? 이런식으로 표현할 수 있겠습니다. (주소크기가 1씩 증가하는건 그냥.. 더보기
2. 포인터가 4바이트인 이유 '포인터는 주소를 가리키기만 하면 되기 때문에 4바이트 이상 필요하지 않아요.' 사람들에게 물어보니 이런 답을 많이 들었습니다. 왜 하필 4바이트일까요. 전 이렇게 생각합니다. 32비트 CPU의 주소값은 4바이트로 표현됩니다. (8비트당 1바이트이기 때문에 ) 예를들어 10진수는 7141840, 11008720, 17038120, 16645524 16진수는 0x103dc90, 0x8047c24, 0x104fa78 이런식이죠.. 만약, 64비트 CPU의 PC(Program counter)가 32비트를 쓰고 있다면 포인터의 크기는 4바이트가 될 것이고, 64비트를 쓰고 있다면 포인터의 크기는 8바이트가 됩니다. (여기서 말하는 PC란 CPU 내부에 있는 레지스터 중의 하나를 말합니다. PC는 다음에 실행될 .. 더보기