본문 바로가기

해킹공부

gremlin 별달리 시작할 말이 없으니 바로 코드를 보겠습니다. gate와 달라진점은 buffer의 크기 한가지밖에 없다. 그런데 shellcode가 24byte인데 buffer + sfp를 해봐도 20byte밖에 안된다. 혹시 dump가 4byte쯤 있을지도 봤지만 그냥 16byte밖에 없다. 하지만 buffer overflow는 입력이 제한된 수를 넘어서 '무한정'들어가는 취약점이다. 즉 RET 위의 메모리에도 무한정 값이 들어가는 것이다. buffer에 A, SFP에 B, RET에 C를 넣고 뒤에는 D를 10개 채웠다. 즉 RET는 0xbffffb4c라는 것을 알 수 있다. RET보다 뒤에 있는 임의의 주소를 넣고 \x90을 충분히 넣은 뒤 shellcode를 입력하여 payload를 만들었다. ./cobolt..
gate system hacking을 차근차근 한번 공부해보기 위해 1단계로 bof를 골랐다. 그래서 이제 lob를 하나씩 풀기로 했습니다. 이것도 소스코드부터 확인해봅시다. 정말 대놓고 bof 문제다. 우선 풀이를 할 내용을 간단하게 요약하자면 1. 특정 메모리(주소를 알 수 있는)에 shellcode를 입력한다. 2. RET주소에 shellcode를 입력한 주소를 넣어준다. 말은 참 쉽다..... 뭘 하던 일단 gdb로 열어보았다. /tmp로 복사해서 열어봐야 볼 수 있다. stack에 dump는 없나보다. 선언한 256byte만 사용하고 있다. 그럼 일단 여기까지 payload는 "A"*260+"RET"이다. 우연히 알았지만 이 프로그램엔 ASLR이 걸려있지 않다. ASLR은 stack의 주소를 random..
codemap exe파일을 리버싱하는 문제같다. 간만에 윈도우 함 써보자는 마음으로 접속했다. nc 0 9021에 접속하면 뭘 물어볼거니까 대답 잘 해주란다. 일단 접속해보자 2번째, 3번째로 큰 chunk값을 물어본다. 인제 codemap.exe파일을 실행해보자 여기서 중요한건 말로는 random size로 한다고 하는데 백만번 해봐도 같은 chunk size에 같은 string이 나온다. 그럼 매번 똑같이 할당될테니 여러번 돌려서 찾아보면 되겠다. 일단 문제에서 (hint: see the information inside EAX,EBX when 0x403E65 is executed) 힌트를 줬으니 유심히 함 보자 힌트에서 말한 부분이다. 0x403E65가 암만 봐도 없었는데 페이징한 가상주소라 맨 뒤 2byte만 ..
cmd1 이번엔 각설하고 소스코드!! argv[1]을 실행하는데 이 부분을 필터링한다. sh를 우선 필터링하면 cmd1_pwn권한으로 shell을 띄울 수 없게 된다. tmp는 직접 짠 프로그램도 못쓰게 하겠다는 의미이다. 야박하다. 모든 필터링을 우회해서 shell을 띄울 고민을 한참 하던 중 shell과 비슷한 모습을 하는 친구가 생각이 났다. python명령어를 실행하면 python 코드를 한 줄씩 수행할 수 있는, 마치 shell과 같은 모습을 띈다. 일단 해봅시다 그럼 안된다. 생각해보니 system함수 앞에서 putenv로 PATH에 욕을 써놨다. 그럼 python의 경로까지 다 입력해주자 된다. cmd1 프로그램을 사용해 실행한 python 명령어이다. cmd1_pwn권한을 갖고 있기 때문에 flag..
shellshock bash에 대한 shocking한 뉴스가 있단다. 얼마나 shocking한지 한번 보도록 하자. 우선 소스코드가 매우 짧다. /home/shellshock/ 경로에 있는 bash shell로 echo명령어를 수행한다. 뭘 어쩌라는건지.... 검색을 거듭한 결과 bash shell에 shellshock라는 취약점이 있다는 것을 알았다. env x='() { :;}; [hidden line]' bash -c "[main line]" shellshock 취약점 구문이다. env x='' 환경변수를 설정해주는 구문으로 뒤에 나오는 hidden line은 실행되지 않는 게 정상이다. 하지만 취약점 패치 전에는 이 hidden line이 실행이 된다고 한다. input값 검증이 제대로 안돼서 일어난 취약점이다. 우..
blackjack blackjack게임이다. millionare에게 flag를 준단다. big money get that 해보자. 일단 게임을 해보자 500달러를 주고 게임을 시작한다. cash부분이 millionare가 되면 될 것 같다. 저 부분을 보여주는 코드로 따라가보자 게임을 수행하는 부분이다. cash_test는 돈이 없으면 쫓아내는 코드이다. randcard()는 카드를 랜덤하게 보여주는 코드이다. 위의 카드모양을 출력해주는 것 같다. dealer()는 잘은 모르겠지만 무언가 수행한 뒤ealer has a total of~~ 이 부분을 출력해준다. 젤 중요한 betting()의 소스이다. 배팅금액을 받고 소지금보다 큰지 확인한다. 그런데 소지금이 더 크면 다시 입력을 받고 이 값은 수정없이 그냥 바로 반환한다..
passcode 10점짜리 문제!!! 시~~~작!!! 파라미터도 없고 반환값도 없는 함수 두 개를 연달아서 실행시켰다. 이렇게 실행하면 assembly에선 연달아서 2번 call을 호출한다. 즉 두 함수의 ebp값이 같다는 것이다. welcome함수에선 그냥 string을 입력받고 출력해준다. 그냥 passcode1,2를 입력받길래 비교값을 그냥 입력했는데 몇번을 해도 안된다. 잘 보니까 scanf에 &passcode1이 아니라 그냥 passcode1로 써놨다. 이러니 안되지... 맨 처음으로 돌아가서 welcome과 login은 같은 ebp 주소를 갖는다. 그래서 welcome의 name과 passcode 2개가 겹칠거라 생각하고 디버깅을 해 보았다. name을 입력받고 출력하는 scanf와 printf 호출부분이다...
lotto 뭔가 쉬운문제만 계속 푸는것 같지만... 이름이 너무 맘에들었으니 풀어주겠다. ( 실제로 하진 않음 ) 이번엔 소스보단 실행을 먼저 해보자 ( 진짜 실제론 안함 ) 정말 한눈에 딱 알게 해놨다. 설명은 화면만 봐도 알 수 있으니 생략하자 ( help는 죄 printf고 exit는 정말 그냥 끝내버린다. ) 코드가 긴 관계로 중요한 부분만 잘라냈다. random하게 받은 6개의 값을 1~45로 한정하고 비교해 match가 6이 되면 flag를 보여준다. /dev/urandom이 의심스러워 여러 방면으로 검색하다 디버깅해본 결과 random값을 잘 주는 멀쩡한 파일이었다. 이번엔 비교하는 for문을 확인해보자. 길이가 6인 문자열 2개를 비교할거면 for문 1개면 되지만 2중으로 사용하였다. 때문에 subm..