반응형

Ghidra로 분석하면 아래와 같은 경고가 나오는 경우가 있다.

 

/* Warning: Call to offcut address within same funct: */

 

Replace.zip
0.01MB

 

 

디컴파일 윈도우에 경고가 표시된다.

함수 안의 다른 주소를 함수처럼 호출한다는 의미이다. 다른 프로그래밍 언어로 이런 개념의 코드를 작성하는 것은 이상하게 보이지만(함수 포인터 등을 이용하면 가능할 거 같기도 하다) 어셈블리 언어에서는 복잡하지 않게 작성할 수 있을거 같다. 이 디컴파일 내용의 어셈블리 명령을 살펴보자.

 

어셈블리 명령 윈도우

FUN_0040466f() 의 첫 번째 명령이 CALL LAB_00404674+6(0040467a) 이다. 잘 살펴보면 0040467a 라는 주소는 바로 아래 명령의 중간 부분이다. 뭔가 이상해서 첫 번째 그림에서와 같이 0040467a 호출 명령은 다른 함수들과 달리 소문자로 주석과 같은 분홍색으로 표시되는거 같다.

 

 

이 부분이 실제 어떻게 진행 되는지 x32dbg로 동적 분석을 진행해 보자.

지금은 00404674 주소에서 아래와 같이 명령이 구성되어 있다.

8105 D0844000 C7051660 add dword ptr ds:[4084D0],601605C7 

 

 

0040466F 에서 call replace.40467A 명령어가 실행되면 00404674 주소에 있는 명령의 중간부터 다시 해석되어 아래와 같이 명령이 바뀐다.

0040467A C705 16604000 EB609061 mov dword ptr ds:[406016],619060EB

 

 

이번엔 아래와 같은 경고를 살펴보자.

 

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */

 

밑줄(_)로 시작하는 전역 변수(여기서는 함수의 이름을 말하는거 같다)가 덮어 씌어진다는 경고인거 같다.

 

 

두 개의 노란색 코드를 보면 _FUN_0040466f()를 덮어 쓰고 있다. 이 경우 함수의 내용이 바뀌게 된다. 그래서 경고를 하는거 같다.

 

 

_FUN_0040466F 를 0xC39000C6 으로 덮어 쓰는 부분이다. 이 명령 실행 전과 후를 비교해 보자.

 

실행 전 0040466F 의 명령이다.

 

 

실행 후 명령이 바뀐것을 볼 수 있다.

 

반응형
Posted by J-sean
:
반응형

Keras 관련 에러를 몇 가지 확인하고 해결해 보자.

 

1)

dense = keras.layers.Dense(10, activation='softmax', input_shape=(784, ))

위 명령을 실행하면 아래와 같은 경고가 출력된다.

UserWarning: Do not pass an `input_shape`/`input_dim` argument to a layer. When using Sequential models, prefer using an `Input(shape)` object as the first layer in the model instead.

경고이므로 무시하고 넘어간다.


model = keras.Sequential(dense)
이어서 위 명령은 아래와 같은 에러가 출력된다.

TypeError: 'Dense' object is not iterable
아래와 같이 바꿔서 해결한다.
model = keras.Sequential([dense])

 

아니면 처음부터 아래와 같이 입력하면 경고나 에러 없이 진행 된다.
model = keras.Sequential([keras.Input(shape=(784, )), keras.layers.Dense(10, activation='softmax')])

 

2)

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

위 명령을 실행하면 아래와 같은 에러가 출력된다.

ValueError: Expected `metrics` argument to be a list, tuple, or dict. Received instead: metrics=accuracy of type <class 'str'>

아래와 같이 바꿔서 해결한다.
model.compile(loss='sparse_categorical_crossentropy', metrics=['accuracy'])

 

 

 

※ 참고

혼자 공부하는 머신러닝 + 딥러닝

 

반응형
Posted by J-sean
: