단축키 기능 n Rename y set Type / comment p make function tab 창 전환 x cross reference u undefine r hex g jump to address

이런 실행파일이 있다고 해보자
입력 값을 4개를 받고 어떤 로직을 통해 출력값을 표시하는 방식인것 같다.

IDA를 통해 분석해보자
main function은 sub_1249를 통해 v4에 저장하고 특정 로직을 통해 flag값을 주는 모양이다
sub_1249를 살펴보자

scanf를 통해 입력을 받고 메모리에 저장하고 있다
v1에 malloc을 통해 동적 할당을 하고 있고 return을 하고 있는데
scanf에서는 int를 입력하고 있다...? 아마도 이 친구는 구조체일 것이다.

IDA Sub view 중에서 Structure 탭에 진입해서 Add new structure를 해보자


필드 추가 후 타입을 정의해보자 위의 sub_12D4를 들어가보면

name을 받아서 포인터에 저장하고 반환한다.

따라서 구조체에는 char* name으로 필드를 선언한다.

이후 sub_1249로 돌아가서 반환 타입을 방금 전 선언한 구조체로 변경해본다.
정상적으로 들어가는것을 확인해본다.

다시 main function으로 돌아와서 유효성을 검사하는 부분에서
첫번째 요소가 50이고, 세번째 요소가 11이고, 두번째 요소가 "SQLinjection"이면 flag를 준다.

Assembly를 직접 수정해 입력 값이 굳이 저게 아니어도 실행하도록 만들어보자

main function에서 "fz short loc_1580" 이부분에서 유효성 검증을 하고 flag를 주는것같다.

Edit > Patch Programs > Assemble 을 눌러 수정 창을 열어본다

jz를 jnz로 변화시켜본다.

그럼 이렇게 && 조건이었던 부분이 || 으로 바뀌어있다
그리고 뒤 조건이 11이 아닐때로 바뀌어있다.

중간에 하나 더 생긴 분기도 마저 jz => jnz로 처리를 해주자

그럼 아예 main function과 반대의 검증을 하게 된다.
아래 SQLinjection 검증 부분도 마저 변경을 해주면

굳이 정답이 아니어도 플래그 값이 나오도록 바뀐다.

마지막으로 Edit > Patch Programes > Apply patches to input files를 통해 적용시켜본다

굳이 정답이 아니어도 Flag값이 나와버린다.