본문 바로가기

0x00 /0x01 Reversing

- C 프로그래밍 의사코드 연습 2

# 이번에는 scanf 함수 의사코드 연습

- 총 4개 샘플 파일을 가지고 해봤습니다.







1.1 혁재가 짠 코드 실행모습

- 정수 입력시 총 5번의 입력을 받는 것을 확인할 수 있었음.

- 문자 입력시 총 1번의 입력만을 받았음.



1.2 혁재 파일 디버깅


- 우선 메인함수 내에서 4Byte 크기의 지역변수 3개를 선언한 것을 확인할 수 있었음.

- 총 4번의 scanf 함수를 사용하였고, 1~3 번째는 정수를 한번씩 받아서, 각 순서대로 변수에 대입.

- 마지막 scanf 함수에서는 3개의 정수를 받아서, 앞에서 받아 저장했던 값들을 모두 덮어씌어버림.

- scanf 함수를 호출하는 caller(메인함수)가 전달한 인자를 정리하는 것과 인자가 오른쪽에서 왼쪽

  편으로 전달되는 것을 보면 cdecl 호출규약이라는 것 또한 파악할 수 있음.


(손으로 한번그려봄 - 초보라서 정확하진 않음) - 새로산 노트3네오로 찍음...에헤헿 화질좋다.



1.3 예상코드 및 실제코드


- 예상 코드


- 실제 코드



1.4 결론

- 생각보다 어렵지 않았다. 혁재가 왠일로...




2.1 건이가 짠 코드 실행모습

- ㅋㅋㅋㅋ 먹고 싶은건 먹어야죠. 

- 문자열을 입력받는 것으로 확인.



2.2 건이가 짠 파일 디버깅

- 우선 메인함수내에서 printf 함수를 2번 사용하고 있고, scanf 사용이 없는 것과 중간에 함수호출있는 것을

  보고 사용자 정의함수를 호출한다고 예상했음.

- 사용자 정의함수는 전달받는 파라미터가 없음(PUSH해서 넘겨주는 파라미터가 없음)



- 사용자 정의 함수 부분이고, 정확히 어떤 변수들을 선언했는지 모르겠음, 특히 EBP-4 가 뭘까...

- EBP-14 부터는 배열로 파악되고, 사이즈는 모르겠음.

- 아무튼 저 배열에 사용자가 입력한 값을 저장하고, 배열에 저장된 것을 printf 함수 인자로 주어서

   출력을함. 




2.3 예상 코드 및 실제 코드


- 예상코드


- 실제코드



2.4 결론

- 사용자 정의 함수의 배열크기는 그냥 때려넣었는데 맞았음. 변수 크기를 좀 더 정확하게

  파악할 수 있도록 연습해야할듯.






3.1 태열이가 짠 코드 실행모습

- 짧게 쓰면 입력을 3번이나 받고, 조금 길게 쓰면 2번 받고, 2줄 출력.

- 디버깅을 해봐야 뭔지 알 수 있을 것 같다.


- 첫 번째 인자에 들어가는 문자수가 10개 이상부터 에러, 첫번째 배열 크기를 10Byte로

  예상, 9개 받고, 마지막 null 문자.




3.2 태열이 파일 디버깅

- 우선 첫번째 인자인 EBP-4 4byte짜리 변수인데, 무슨 변수인지 감이안온다...

- 그런후 EBP-14 (10BYTE 배열)에 사용자로부터 문자열을 입력받는다.

- 그 다음은 문자하나를 입력받아 배열 첫번째 방에 넣는다. 

- 마지막으로 새로운 배열에 16진수 정수를 사용자로부터 입력받는다.


- 입력을 다 받은 후, 그 2개의 배열을 출력하는 코드이다.







3.3 예상 코드 및 실제 코드


- 예상 코드


- 실제 코드




3.4 결론

- 틀린 부분이 꾀 있는데, 그래도 나름 비슷하게 적중한것으로 판단.





4.1 현민이 코드 실행모습

- 현민이꺼는 입력을 한번만 받고 있음.

- 많이 넣어보니까, 에러. 포인터가 아닌 배열을 사용하고 있는 것으로 판단.



4.2 현민이 파일 디버깅

- 지역 변수로 배열 하나가 선언되고 사용자가 입력받은 값을 넣는다. 배열크기는 실행할때 에러나기 직전까지

   입력해본 결과 29글자가 들어갔다. 따라서 29+1 마지막 널값해서 배열크기는 30으로 예상

- 그외 다른것은 없는 것으로 판단.



4.3 예상 코드 및 실제 코드


- 예상 코드


- 실제 코드



4.4 결론

- 디버깅때 너무 없어서 더 이상했음. 그래서 쓸모없는 이상한 함수들에서 삽질을

   조금 했었음. 전반적인 코드 내용은 비슷하게 된것 같음.