목록Dreamhack (5)
안 쓰던 블로그
size를 입력 받은 다음 데이터를 입력 받는 문제 소스코드를 보면, get_shell함수가 보이고 main에 buf, size 등이 있다 메모리에는 다음과 같이 들어갈 것이다 생략 .... size buf main's sfp main's ret 전형적인 bof문제같이 보이는데, 한 가지 문제가 있다면 if문에서 너무 큰 사이즈를 넘겨버린다는 점이다 그냥 무작정 256를 넘는 범위를 보내면 if문에서 걸러진다 그러면 어떻게 size를 주어야 if문에 안 걸리고 256이 넘는 데이터를 보낼 수 있을까? 드림핵에 이 강의(dreamhack.io/learn/2/12#11)를 참고하라고 하면서 힌트를 준다 int범위는 -2^31 ~ 2^31-1 의 범위를 갖는다 또한 int같은 변수들은 최대 범위를 넘어가면 다..
굉장히 익숙한 main함수 자연스럽게 함수 들어간다 처음에 스택 공간 할당하고 CMP RAX, 18과 MOV EAX, 1이 한 세트니까 for문을 0x18번 돈다는 것을 알 수 있다 플래그가 총 0x18(24)글자라는 걸 생각하고 아래 for문을 본다 for문 안에서는 아래같은 연산을 한다 1) 문자열 받은 것과 연산 RAX에 현재 카운터 주소값의 값을 넣고 RCX에는 입력받은 문자열 시작점 주소를 넣는다 EAX에 [시작점+카운터값]주소의 값을 넣으니까 a[i]가 된다(문자열이 a라고 할 때) MOV ECX, DWORD PTR SS:[RSP]에서 RSP는 지금 돌고 있는 카운터 값이다 카운터 값을 ECX에 넣는다는 의미이다 INC는 증감 연산자이다 피연산자++ 동작을 한다 지금은 ECX를 ++하고 있다 ..
먼저 메인 함수를 본다. main을 보면 구조는 이전 문제들이랑 다르지 않다 함수에 들어가 본다 RCX(입력값)을 RSP+8 주소에 가져온다 RSP에 18만큼의 공간을 준비한다 RSP주소에는 0을 넣는다 JMP한다 CMP RAX, 1C를 하는데 RAC와 1C를 비교하는 것 결과값이 ~65주소보다 크거나 같으면(JAE) EAX에 1을 넣고 RSP에 18을 더하면서 종료된다 계속 비교하며 반복하는 모습이 보이니 즉 이 부분은 for문이다 for(int i=0; i>4 연산인 것이다 이 연산이 끝나면 RAX가 4가 된다 RDX에 다시 Hello를 가져온다(RSP+20 주소) ECX에 rdx+rcx*1: "Hello"를 한다 ECX에 'H'인 48이 들어간다 SHL은 왼쪽 쉬프트 연산. ECX가 원래 48이었는..
이 문제에서도 rev1처럼 입력을 받고 뭔가 함수 호출 후에 corret wrong에 따라 분기한다 분기문에서 bp걸고 f7로 내부로 들어갔다 문자열을 한 글자씩 가져온 후에 어떤 연산을 거치고 input과 비교한다 한 글자씩 비교하는 함수를 총 0x18(23)번 반복하기 때문에 Flag가 총 0x18(23)글자인것을 먼저 확인해야 한다 (마지막은 \00) 첫 번째 글자를 구할 때는 카운트가 0부터 시작되기 때문에 Flag 첫 글자와 연산에 사용되는 비교 문자의 글자가 동일하다. 일단 규칙을 찾아야 한다. 첫 번째 글자는 그랬는데 두번째 글자부터는 카운트가 1로 증가하며 뭔가 연산이 시작되는 것을 볼 수 있음 첫 번째로 본인이 입력한 글자 ^ 카운트 연산을 한다 두 번째로 첫 번째 연산 과정에서 구한 결..
프로그램 실행-input: 이라는 게 뜨고 입력하면 종료된다 문자열 검색-input이 있다 사실 여기서도 누가봐도 플래그 같이 생긴 문자열이 있긴 하다.. input으로 이동한다 처음에는 input: 을 출력한다 그리고 256바이트를 입력 받는다 CALL 0x00007FF7B2B41000 해서 해당 함수를 호출한다 호출해서 나온 결과값을 비교해서 0이면 corret 틀리면 wrong을 출력한다 일단 함수에 따라 들어가보면 아래처럼 있다 위에서 입력받은 값을 Compar3_the_str1ng과 strcmp함수로 비교한다 strcmp는 동일하면 0을 반환한다 JNE로 0이 아니면 1이고 0이면 0을 리턴한다 어쨌든 여기서도 플래그를 확인할 수 있다 Compar3_the_str1ng 여기서 0으르 리턴하면 위..