CNUproject/코드 동일성 검사 도구

4_Symbolic Execution 체험해보기(2)

YUMMMM 2023. 3. 31. 02:02

저번주차에 간단하고 아주 비슷한 c코드 두 개 작성 후 컴파일하고 Symbolic Execution를 비교하는 과제를 진행했는데, 어셈블리어와 Symbolic Execution이 똑같이 나오는 문제가 있었다.

어셈블리어를 살펴보니 main함수를 호출하는 start 함수가 디스어셈블 되어 출력되어 서로 다른 c코드의 실행파일을 입력파일로 넣고 실행했을 때도 똑같은 결과가 출력되었던 것이었다.

 

해결방법으로 main함수의 시작주소를 직접 넣어주는 것을 선택했다. 두 코드 모두 main 함수의 시작 주소가 0x080483db이므로 addr 변수에 해당 주소를 넣어서 해당 코드를 실행해보았다.

test_sum test_sub

 

 

1) 어셈블리어 비교

test_sum                                                                                              test_sub
둘의 가장 큰 차이는 sum을 수행하는 함수에서는 edx, eax 레지스터에 각각 3, 2를 넣어주고 add 연산자를 통해 더한 결과값을 eax에 넣어준다면, sub을 수행하는 함수에서는 eax에 3을 넣은 후, 2는 따로 레지스터에 넣지 않고 바로 2가 저장되어있는 주소에 접근하여 값을 가져와 그 값을 eax에서 뺀 결과를 다시 eax에 넣어준다는 것이다.

 

2) Symbolic Execution 비교(log 살펴보기)

test_sum test_sub

eax에 2를 넣어주고, 앞서 3을 넣은 edx를 add 연산 해주는 부분이 나와있다.

add instruction이 실행된 후 밑에 register를 살펴보면 edx에는 3이, eax에는 2+3을 계산한 결과값인 5가 담겨있는 것을 확인할 수 있다.
앞서 eax에 3을 넣은 상태에서, ebp+0xFFFFFFF8 위치에 있는 2를 sub 연산 해주는 부분이 나와있다.

sub instruction이 실행된 후 밑에 register를 살펴보면 eax에 3-2를 계산한 결과값인 1가 담겨있는 것을 확인할 수 있다.

 

3) 느낀 점

symbolic execution을 비교할 때 상태(flag)레지스터는 왜 저런 값을 가지게 되는지 이해를 못 했는데 이 부분도 코드 흐름을 따라가면서 왜 이런 값을 가지게 되는지 공부해볼 필요성을 느꼈다.

 

+ 회의할 때 교수님이 flag 레지스터 확인 안 해도 된다고 하셨다!