728x90

Format string Bug

return 위의 sprinf 함수는 %s에 v5값을 넣어서 s에서 출력해준다. 이후 return에서 해당 문자열을 출력시켜준다.


위 소스중 prinf에서 format string bug가 발생합니다. format string bug는 출력하는 문자열에 문자 format을 입력하면 해당 형식에 맞게 stack에 있는 값을 출력해줍니다.


프로그램에 일정 문자열을 삽입해주고 서식문자를 통해 해당 문자가 몇번째에 출력되는지 파악합니다.

문자 2개를 입력한뒤 문자 4개를 입력하면 12번째에 4개의 문자가 입력되는것을 확인 할 수있습니다.


계획

문자와 서식문자들을 입력할 때 사용하는 getnline함수이다.

위 함수의 strchr함수를 system함수로 바꿔주고, main을 한번더 실행시켜 main에서 인자에 /bin/sh을 입력해주면 쉘을 얻을 수 있을것이다.


getnline함수에 값을 입력한후 한번더 메인으로 돌아가기 위해


위 주소를 써준다. .fini_array는 프로세스 종료전에 실행되는 함수의 포인터 배열 이라고 나온다. 즉 프로세스가 종료될 때 실행시키는 함수이다.

이주소를 main 시작 주소로 바꿔주고 strchr주소에 system 주소를 넣어준다.


알아야 할것 : main 주소, system 주소, strchr 주소, .fini_array주소




주의할 점 : 

노란색 박스로 출력되는 부분도 %d에 포함되기때문에 aa까지 총 20바이트가 포함되어있는 값으로 계산해야한다.




format string bug에서 got overwrite를 할때 2byte씩 잘라서 보내준다. 값이 너무 크기때문


payload += "%{}d%12$hn".format((main&0xffff)-32) // “%{}d%12$hn”.format((main&0xffff)-32)에서 {}format의 내용이 들어간다. (Main&0xffff) - 32

위의 hn은 앞의 출력된 문자의 수를 2바이트 만큼 입력하겠다는 문자열이다.


payload += "%{}d%13$hn".format(0x10000+(system>>16)-(main&0xffff))

위에서 +0x10000(sytem>>16)-(main&0xffff)가 음수이기 때문이다. 위에서는 크기를 나타내야하기 때문에 +0x10000으로 양수 값을 맞춰준다.


fsb에서는 “%{}d%hn”.format(구해야하는값)을 통해서 {}에 편하게 값을 넣어주는게 좋을것같다.

728x90

'CTF_writeup > 2018' 카테고리의 다른 글

Noote_ver0  (0) 2018.12.22
PCTF_2013_ropasaurusrex  (0) 2018.12.22
Trustealth CTF easy  (0) 2018.12.22
ISITDTU_CTF_dead_note_lv1  (0) 2018.12.22
ISITDTU CTF_xoxopwn  (0) 2018.12.22

+ Recent posts