본문 바로가기

해킹공부/pwnable.kr

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..
mistake 뭔가 실수를 했는갑다. hint : operator priority 뭘 어쩌란건지 한참 보다가 힌트에서 힌트를 얻고( 역시 문제를 잘 봐야되 ) 연산자 위주로 살펴보았다. if( fd=open("/home/mistake/password",O_RDONLY,0400) 0) 이걸 보고 알았다. 연산 순서를 찾아보니 대입연산자가 비교연산자보다 순위가 뒤인걸 알아냈다. 즉 '>'연산을 '='연산보다 먼저 수행하는 것이다. open()함수는 파일을 성공적으로 열면 file descriptor 번호를 반환한다. 이때 0,1,2는..
random 순서대로 passcode를 풀 차례지만 10점에 허걱하고 옆에있는 1점짜리 random 먼저 풀기로 했다. 이름이 random이니 random하게 순서가 매겨졌다( 뭐래... ) rand()함수를 사용해 받은 값과 scanf()로 입력받은 key값을 xor한 값이 0xdeadbeef여야 한다. rand()함수를 사용해본 사람들은 알겠지만 srand를 사용해 시드값을 바꿔주지 않으면 rand()함수는 매번 똑같은 값을 반환한다. 웹 컴파일러를 사용해 확인해보자 매번 1804289383을 반환한다. 그럼 이 값과 xor연산을 했을 때 0xdeadbeef가 나오는 값은 random값과 0xdeadbeef의 xor연산을 통해 알 수 있다. 0xdeadbeef ^ 0x6B8B4567(random in hex) =..