목록Study/Reversing (22)
촉촉한초코칩
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/OxX0g/btsJoZiJ6PG/gOQLJh90Ct6Wb6ot3YBj61/img.png)
풀이힌트 링크를 보니 gdb를 사용하라고 되어 있어서 gdb에서 열어보았다. 파일을 실행하면 입력할 틈도 없이 출력되고 끝이 나게 된다. 입력값이 10개라는 건가..? 문장이 10글자..? 방향을 못잡겠어서 블로그 참고.. https://velog.io/@kkangjane/Dreamhack-War-game-small-counterrbp+var_4 값에 따라 Nice, END로 나뉜다. gdb에서 이부분에 break를 걸고 실행해본다. (warning이 뜨면서 동작이 안돼서 다른 방식으로했더니 됐다. -> break 할 때 주소로 입력하지 말고 *main+n으로 입력하기)그리고 해당 값에 5를 넣는다. (5로 인식될 수 있도록)흠 여기가 아닌 것 같다. 다시 5랑 비교하는 부분을 찾아본다. 이제야 이..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/GaanW/btsI4Pg0SXI/VQeNuE2KOJTWMk5Fxuy8PK/img.png)
문제파일로는 html하나만 주어진다. 코드다 담겨지지도 않는다..우선 submit 버튼에 함수가 있는데, 입력한 값이 같이 전달되어서 찾아보았다. _0x9a220마지막 if문에서 _0x3eebe5의 값과 _0x540d50의 값이 같아야 출력되는 것 같다.... _0x3eebe5만약 _0xceb417이 null이라면, _0x30bf04 값을 _0x4cd335 함수로 호출한다. 먄약 null이 아니라면, _0x169ee3이 false라면, _0x30bf04 값을 _0x42115c 함수로 호출한다. 만약 _0x169ee3이 false라면, null과 _0x30bf04 값을 _0x4fb15f 함수로 호출한다. 1) _0x4cd335 _0x30bf04 에 _0x199598 함수에 보낸다. _0x199598 함..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/tVhhU/btsIRMSqbmC/9qdUjnedHTrbXSCDjBN6kk/img.png)
먼저 chall 파일을 실행해보았다. rand num이 나오고 Input값이 맞아야..? result로 flag가 출력되는 것 같다. 분석1IDA로는 안 열려서 우분투 pwndbg로 분석했다. gdb ./chall disass mainget_rand_num → Random number 출력해주는 부분 같다. 그 뒤로 scanf, printf하는 함수가 나오고 문자열을 비교하는 함수를 발견했다. 저 부분에 break를 걸고 실행하면서 어떻게 비교하고 진행되는지 보았다. break strcmp 입력값을 줘야 하는데 주지 않고 실행하니까 잘 안되는 것 같아서 get_rand_num에 break를 걸고 실행했다. b *0x00005555555553bb이번에는 입력값을 주고 난 후 break가 걸리도록 했다. ..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/ssyGy/btsIO1PTkej/egZfoQ2VUACh61s0ZMlE7K/img.png)
구조는 rev-basic 이전 문제와 동일하다. 메인 함수를 디컴파일링 해준다. (F5) sub_140001000에서 문자를 비교하는 것 같아서 들어가보았다. i가 28이 될 때까지 반복문을 돌리고if문에 맞으면, 정답인 것 같다.. if문에 저 코드가 뭔지 모르겠어서 gpt에 물어보았다..ㅎㅎ 이 조건문은 a1 포인터와 byte_140003000 배열의 i번째 요소를 비교하는 것입니다. 구체적으로는, a1 + i 주소에서 1바이트 값을 가져와서 두 가지 연산을 수행합니다:가져온 값을 16배하고 8비트 부호 없는 정수로 캐스팅합니다.가져온 값을 8비트 부호 없는 정수로 캐스팅하고, 32비트 정수로 캐스팅한 후 4비트 오른쪽으로 시프트합니다.두 결과를 비트 OR 연산합니다.이 결과가 byte_14000..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/cakOST/btsIE3mAX0l/VF08WrY6NjWZYs0TGR85N0/img.png)
코드 (IDA로 열었다.) __security_cookie 부분이 수상해서 들어가보았다. 여기 문자열을 합쳐서 정답으로 입력해보았다.DH{Comp4re_the_arr4y} 정답.. 코드를 세심하게 볼 것...
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/Hnpgi/btsIqdQfUq1/83WDBiQPVbZu4iPQzC2d2k/img.png)
권한을 주고 실행하니 이런 메시지가 나왔다. 실행파일로 만들어야된다. cat 명령어로 보니 안에 이런 문자들이 있었다.안에도 Usage : 이 부분이 있어서 다음 문자열을 ./prob 실행할 때 같이 넣어줬다.아닌것 같다.. 풀이 찾아보니까 main이 아니라 _start 함수를 통해 시작하는 것 같은데.. 어떻게 찾지 하다가 gcc 명령어로 찾음그리고 해당 에러는 링커 에러라고 한다. 일단 함수 하나는 알아냈으니까 gdb로 분석해보았다.여기서 key 값을 확인하는 것 같다.edx끼리 xor 연산하고 esi의 값을 dl에 넣는다.0x804a10c와 dl을 xor연산하고 edi의 값과 dl을 xor 연산한다.ecx와 edx는 or 연산하고 esi, edi 증가하고 eax는 1 감소시킨다.그리고 0x804..