본문 바로가기

바이트 오더링( 빅 엔디언, 리틀 엔디언 ) 바이트 오더링이란 데이터를 저장하는 방식을 말합니다.빅 엔디언 표기법과 리틀 엔디언표기법 2가지 방식이 있습니다 1. 빅 엔디언 표기법대형 UNIX 서버에 사용되는 RSIC 계열의 CPU에 많이 사용되고, 네트워크프로토콜에 사용됩니다.데이터를 저장할 때 사람이 보는 방식과 동일하게 순차적으로 저장합니다.ex) 0x12345678 -> (빅 에디언 표기법) 0x12345678 2. 리틀 엔디언 표기법리틀 엔디언은 Intel x86 CPU에서 사용되므로 Windows계열 리버싱을 위해 리틀 엔디언 방식을 잘 알아야 합니다. 데이터를 저장할 때 역순으로 저장합니다.ex) 0x12345678 -> (리틀 에디언 표기법) 0x78563412데이터를 역순으로 저장시키기므로 산술 연산과 데이터의 타입이 확장/축소될 .. 더보기
리버싱 ( Reversing ) Reverse Engineering 의 줄임말입니다. 제작된 프로그램의 동작방식을 관찰하며 원래 소스 코드를 복원해내는 작업입니다. 리버싱을 통해 프로그램의 흐름이나 구조, 취약점을 찾아낼 수 있고 패치나 크랙도 가능합니다ㅎㅎ 더보기
해커스쿨 FTZ 문제풀이 최종본 pdf by ORANG 몇일간 틈틈이 작성한건데.. 다 쓰고나니 뿌듯하네요ㅎㅎ이제와서 생각해보니 설명이 부족했던 부분이 많았던 것 같기도 하네요ㅠㅠ제가 생각하는 것들을 그대로 글로 표현한다는게 생각보다 너무 어려운 것 같습니다...읽다가 궁금한 부분이나, 잘못 설명된 부분 발견하신 분은 댓글 달아주시면 감사하겠습니다!!다른 공부와 같이 하느라.. LOB 문제풀이는 틈틈이 시간날 때마다 작성하겠습니다!! 모두들 열공하시길ㅎㅎ!! 더보기
해커스쿨 FTZ ( level20 -> clear ) + 포맷스트링버그의 이해 by ORANG FTZ_level20 마지막 문제네요ㅎㅎ level20은 포맷스트링 문제입니다지금까지 풀어온 BOF와는 다른 방법을 이용해야하죠먼저 포맷스트링버그( FSB : Format String Bug )에 대한 개념부터 가볍게 잡겠습니다. 음.. 포맷스트링은 c언어 printf 에서 사용하는 %d, %x, %f 같은 문자 입니다. %c 단일 문자 %d 부호 있는 10진 정수 %i 부호 있는 10진 정수, %d 와 같음 %f 부호 있는 10진 실수 %s 문자열 %o 부호 없는 8진수 %u 부호 없는 10진수 %x 부호 없는 16진수 %e 부동 소수점 표기, e 사용 %n 쓰인 총 바이트 수 등이 있죠ㅎㅎ여기서 FSB에 가장 중요한 포맷스트링은 %x와 %n입니다%x는 부호없는 16진수 출력이죠 -> 16진수 출력이라.. 더보기
해커스쿨 FTZ ( level19 -> level20 ) by ORANG FTZ_level19 [level19@ftz level19]$ bash2[level19@ftz level19]$ cat hint main(){ char buf[20]; gets(buf); printf("%s\n",buf);} bash2 띄우고~ hint를 보겠습니다.level18 문제 보다가 이걸 보니 참 좋네요ㅋㅋㅋ너무 간단한 BOF문제네요 자세히 보면 setreuid 함수가 없는게 약간의 문제인 것 같네요하지만 권한을 살펴보면 당연히 setuid가 걸려있습니다 [level19@ftz level19]$ ls -l attackme-rwsr-x--- 1 level20 level19 13615 3월 8 2003 attackme 이럴땐 간단하게, setuid + bash셸을 실행하는 셸코드를 작성하면 됩니다... 더보기
해커스쿨 FTZ ( level18 -> level19 ) by ORANG FTZ_level18 [level18@ftz level18]$ bash2[level18@ftz level18]$ cat hint #include #include #include #include void shellout(void);int main(){ char string[100]; int check; int x = 0; int count = 0; fd_set fds; printf("Enter your command: "); fflush(stdout); while(1) { if(count >= 100) printf("what are you trying to do?\n"); if(check == 0xdeadbeef) shellout(); else { FD_ZERO(&fds); FD_SET(STDIN_FILE.. 더보기
해커스쿨 FTZ ( level17 -> level18 ) by ORANG FTZ_level17 [level17@ftz level17]$ bash2[level17@ftz level17]$ cat hint #include void printit() { printf("Hello there!\n");} main(){ int crap; void (*call)()=printit; char buf[20]; fgets(buf,48,stdin); setreuid(3098,3098); call();} bash2 띄우고~~ 힌트를 보니 level16문제에서 shell 함수가 사라진 것 같네요ㅎㅎbuf에 셸코드를 집어넣고, printit 함수의 호출 부분( call(); )을 buf의 주소로 바꿔주면 될 것 같습니다. gdb로 분석하고 메모리 구조를 그려보겠습니다~ (gdb) disas mainD.. 더보기
해커스쿨 FTZ ( level16 -> level17 ) by ORANG FTZ_level16 [level16@ftz level16]$ bash2[level16@ftz level16]$ cat hint #include void shell() { setreuid(3097,3097); system("/bin/sh");} void printit() { printf("Hello there!\n");} main(){ int crap; void (*call)()=printit; char buf[20]; fgets(buf,48,stdin); call();} bash2 띄우고~ 힌트를 확인해보겠습니다!printit함수의 호출부분( call(); )이 있으니 그 부분에서 shell 함수를 호출하도록 바꿔주겠습니다. gdb를 이용해 분석해보겠습니다. (gdb) disas mainDump of .. 더보기
해커스쿨 FTZ ( level15 -> level16 ) by ORANG FTZ_level15 [level15@ftz level15]$ bash2[level15@ftz level15]$ cat hint #include main(){ int crap; int *check; char buf[20]; fgets(buf,45,stdin); if (*check==0xdeadbeef) { setreuid(3096,3096); system("/bin/sh"); }} 이번에도 bash2를 띄우고!! 힌트를 보겠습니다level14와 아주 비슷하지만 check 가 포인터로 되어있네요ㅎㅎ0xdeadbeef를 넣어주고, 그 주소를 가리키도록 바꾸어 공격해보겠습니다. 메모리 구조를 그리는 과정은 level14와 같으므로 생략하겠습니다.buf 의 시작 주소가 필요하겠네요ㅎㅎ 찾아보겠습니다. RET [.. 더보기
해커스쿨 FTZ ( level14 -> level15 ) by ORANG FTZ_level14 [level14@ftz level14]$ bash2[level14@ftz level14]$ cat hint 레벨14 이후로는 mainsource의 문제를 그대로 가져왔습니다.버퍼 오버플로우, 포맷스트링을 학습하는데는 이 문제들이최고의 효과를 가져다줍니다. #include #include main(){ int crap; int check; char buf[20]; fgets(buf,45,stdin); if (check==0xdeadbeef) { setreuid(3095,3095); system("/bin/sh"); }} bash2부터 띄우고~~ 힌트를 보니 level14와 비슷합니다 ㅎㅎ하지만 fgets 함수로 입력받는 최대 크기가 45바이트로 되어있네요check 부분을 0xdeadb.. 더보기