Pwnable/▷ Study (14) 썸네일형 리스트형 SROP 32bit, 64bit BOB 과제하면서 SROP 관련 문제가 나왔다.하지만 SROP에 대해 잘 몰라서 여러 문서들을 보고 따라해보면서 감을 익혔다.일단 간단한 32bit 예제와 64bit 예제를 만들고 SROP를 적용해 쉘을 따보는 연습을 내용에 담았다. 32bit SROP 예제 (test.c)gcc -o test test.c -fno-stack-protector (Ubuntu 14.04 32bit)char sh[] = "/bin/sh"; void int80() { asm("int $0x80"); } void main() { char buf[8]; read(0, buf, 128);//Overflow 취약점 } 32bit sigcontext # ifdef __i386__ struct sigcontext { __u16 gs, _.. pig_hunting 보호되어 있는 글입니다. lob 20 1234567891011121314151617181920212223242526from socket import *import struct p = lambda x : struct.pack(" lob 18 plt를 이용하라는 문제다. 보면 strcpy로 오버플로우가 일어나는데 ret부분에 덮을 주소가 strcpy 주소여야한다.그 다음 ret+4 에 'AAAA'로 바꾼다.전에 lob 문제 풀때 보면 함수가 main, f1, f2, f3, f4, f5 이런식으로 있었는데 이 문제에서도 strcpy 때문에 오버플로우가 일어났었다. 버퍼가 40이라고 가정하고 "A"*44 + (f1 시작주소) + (f2 시작주소) + (f3 시작주소) + (f4 시작주소) + (f5 시작주소)이런식으로 payload 를 입력했는데 출력이 f1~5 함수 printf 내용이 다 출력되었다.gdb로 leave ret에다 브포 걸어놓고 si ni 명령어 이용해서 하나하나 i reg esp, i reg ebp 치면서 스택구조를 보았던게 도.. ftz level20 fgets 로 입력 문자열 제한을 걸어놨기 때문에 오버플로우는 불가능하다. 취약점이 터지는 부분은 바로 printf 부분이다.보통 printf 함수를 쓸때는 앞에 서식문자를 쓰고 뒤에 인자를 넣기 마련인데 해당 문제 printf함수를 보면 인자만 들어가있다.문제가 뭐냐면 만약 fgets로 입력받은 문자열에 서식문자(%x, %d등) 이 존재한다면 이를 문자열로 처리하지 않고 서식문자로 판단하게 된다.여기서 문제가 발생하는데 %n 서식문자를 사용하면 특정 메모리 주소에 값을 덮을 수 있다. 1. 환경변수 SHELL 등록 (export SHELL=$(python -c 'print \x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\ x6e\x89\xe3\x50\x53\x89.. ftz level19 해당 문제 코드는 정말로 간단하다.그래서 일반적인 RTL 페이로드를 작성한 후에 실행하였더니 권한이 level20으로 올라가질 않는다.이유를 찾아봤더니 setreuid 함수가 없다.RTL 에서 setreuid 도 추가하여 RTL Chaining 기법으로 문제를 풀었다. (참고 - 일단 구조먼저 살펴보면str[20] + dummy[20] + sfp[4] + ret[4] 이다. 필요한 것1. system() 함수 주소 (0x4203f2c0)2. /bin/sh 함수 주소 (0x421273a4)3. pop_pop_ret gardget (setreuid 인자가 2개이므로 pop 이 두개다) (0x804849d)4. setreuid 함수 주소 (0x420d7920) 5. setreuid 인자3100 3100 이므로.. ftz level18 문제 보자마자 솔직히 넘 놀랐다. 코드가 너무 길어서 어려워보였다.. 게다가 군데군데 처음보는 함수들도 존재해서 겁먹었는데 분석해보면 완전 쉽다.일단 gdb로 보면check 값이 ebp-104에 존재하는데 string[100] 배열은 check 4byte 바로 위에 존재한다.그러면 이 check 값을 변조시키려면 0x8을 4번 넣으면 된다. 그 다음에 0xdeadbeef 값을 입력하면 간단하게 공격이 성공한다.(python -c 'print "\x08"*4+"\xef\xbe\xad\xde"';cat) | ./attackme ftz level17 gdb로 보면 ebp-56 주소부터 입력값을 넣는데 call() 부분에 들어가는 주소는 ebp-40부터다.RTL 해보려고 하면 fgets 가 48byte까지 밖에 입력을 안하므로 4byte(/bin/sh_addr)가 짤린다.그래서 그냥 쉘코드 넣고 call 주소 조작하려고 해보면 aslr 걸려있어서 안된다.이거 그냥 풀 수 있는 방법이 환경변수 빼면 없는거 같은데 로컬에서밖에 풀 수 없는 환경변수 풀이는 개인적으로 싫어해서 그냥 넘어간다. 이전 1 2 다음