[3주차] swing_register_asssignment.exe 분석

swing_register_asssignment에서 다른 모듈 호출하는 명령 목록을 가져온다.
_cexit을 찾아서 주소로 간다.

image1

해당 _cexit 위에 있는 call이 메인 함수인 거 같다. 해당 callee를 더블 클릭해본다.

image2

puts 같은 출력 함수와 문자열에 있는 걸 보아 main이 맞는 거 같다.

image3

중단점을 설정하고 해당 부분까지 f9로 와준다.

image4

맨 위 Hello SWING 문자열 명령을 분석해보면
swing_register_as~(짤렸다)부분 주소를 hex로 보면

image5

일단 주소가 00404052임을 알 수 있다. 왼쪽 ascii 부분에 Hello SWING!이 맞게 써져 있다.
mov로 esp에 옮겨주는데

image6

원래 이랬던 esp가 명령을 실행하면

image7

이렇게 변한다. 맨 앞 4bytes만 리틀 엔디안으로 읽으면 00040452
아까 본 Hello SWING!이 담겨 있는 주소이다.

출력 명령을 할 차례이다.

image8

디버깅 창에 문자열이 뜬 걸 알 수 있다.

image9

다음 문자열은 call로 다른 함수를 호출해온다.

image10

f7로 진입해보면 ebp가 나온다.

image11

들어간 직후 스택 상단에 들어간 00401643값은

image12

아까 호출했던 명령어 다음 주소이다.

image13

위 callee를 실행하면 eax가 7이다. 어떻게 7이라는 값이 나왔을까

image14

mov eax, dword ptr ss:[esp+18] 에서 esp+18에 저장된 값이다.

image15

mov eax, dword ptr ss:[esp+1C] 에서 esp+1C에 저장된 값이다.

image16

해당 값들은 eax에 옮겼다가 스택에 넣어줬기 때문에 스택 상황은 위와 같다.
마지막 eax에는 3이 있다.

image17

callee에 들어간 후 어셈블리이다.
ebp+8과 ebp+C에 있는 4,3을 가져와서 add 해주므로 값은 7이다.

image18

eax값이 7로 반환된 것을 확인할 수 있다.

image19

print 함수 실행

image20

디버깅 화면에 7로 알맞게 출력되었다.

image21

다음 callee에 진입해보면

image22

위와 같다

image23

아까와 동일하게 caller 다음 주소가 stack에 쌓인다.

image24

분기문이 있다. ebp-C가 어떤 flag의 역할을 해서 계속 대소 연산을 해주는 거 같다.

image25

jle less일 때 분기해주는 거 같다.
바로 직전 명령어가 4와 비교이기 때문에
if([ebp-C]<4)
    jmp
인 거 같다.

image26

image27

I am Main %d을 출력해준다. 이때 %d는 eax 값이다.

image28

디버깅 화면이다.

image29

eax가 4가 될 때까지 루프 돌렸다. eax가 4가 되면 jle가 분기되지 않고

image30

다음으로 넘어가는 걸 알 수 있다.
이후는 return 0을 위한 코드로 종료를 해주는 거 같다.