본문 바로가기

스터디/CTF

ctf 공부 9일차

HackCTF

Basic_BOF #1

프로그램을 동작해보면, 입력을 받고, 입력 받은 문자열과 어떤 주소값으로 추정되는 무언가를 출력해준다.

 

IDA로 열어보면, main함수는 아래와 같다. fgets에서 입력받고, 위의 동작에서 확인 가능한 [buf]: '입력한 문자'와 [check] 0x4030201을 출력해둔 후 cmp결과에 따라 je나 jne를 하는 부분이 있는데, 이 부분을 잘 조정해주어야 flag가 출력될 것 같다.

 

cmp부분에서 [ebp+var_C] 와 0DEADBEEFh가 같아야 jmp를 하지 않아서 /bin/dash를 실행할 수 있다. 

 

main함수를 선택한 뒤, f5를 눌러서 소스코드를 확인해보았다. 역시 소스코드로 변환해주니까 이제야 프로그램 구조가 제대로 보인다. v5변수에 -559038737이 저장되어 있어야 /bin/dash가 실행된다. 

사실  궁금했던 것은 fgets로 입력받는 값을 저장하는 변수의 주소였는데, 이 소스코드에서 ebp-0x34임을 알 수 있다.(s에다 입력받는데, s의 주소위치가 ebp-34h라고 되어있으므로) 

참고: IDA - 사용법 및 단축키 :: Pw4ngC0 (tistory.com)

 

이제 gdb로도 확인해보자. 

main함수는 다음과 같다. fget해서 받은 문자열을 저장해두는 변수의 주소를 찾고, 이를 오버플로우해서 ebp-0xc 위치에 0xdeadbeef가 저장되도록 하면 된다. 위에서 소스코드를 확인해본 결과 fgets로 입력받은 변수(s)의 주소는 ebp-0x34였으므로, 40(0x34-0xc=0x28)만큼에 dummy값을 넣어주고, 이후에 deadbeef를 넣어주면 된다.(이때 32bit little endian방식으로 packing해준다.)

 

익스플로잇 코드를 작성한다. p32로 넣으면 오류나서 이거 다시 알아보고 글 수정할 예정!!

'스터디 > CTF' 카테고리의 다른 글

ctf 공부 11일차  (0) 2021.07.17
ctf 공부 10일차  (0) 2021.07.14
ctf 공부 8일차  (0) 2021.07.12
ctf 공부 7일차  (0) 2021.07.11
ctf 공부 5일차  (0) 2021.07.09