목록Stack (15)
ii4gsp
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bf6wFl/btqCaSlTdij/O4cxE5i2gCBvShUfGoCpck/img.png)
#include #include #include int main(int argc, char * argv[]){ char buf[128]; if(argc == 1){ printf("Usage: %s argument\n", argv[0]); exit(1); } strcpy(buf,argv[1]); printf("%s", buf); return 0; } 변수 buf가 128byte 할당되었고, buf ~ sfp = 132 이다. 132byte dummy를 주고 ret를 조작해주면된다. strcpy()함수에서 취약점이 발생한다. ret까지 덮어주고 스택 확인 0xffffd848을 ret로 잡고 페이로드 작성 Narnia3 = vaequeezee
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cq3nm2/btqBVMdD9pR/geL8aej9QM2rx0Zz8gJERK/img.png)
#include #include #include #include #include /* gcc -o ch35 ch35.c -fno-stack-protector -no-pie -Wl,-z,relro,-z,now,-z,noexecstack */ void callMeMaybe(){ char *argv[] = { "/bin/bash", "-p", NULL }; execve(argv[0], argv, NULL); } int main(int argc, char **argv){ char buffer[256]; int len, i; scanf("%s", buffer); len = strlen(buffer); printf("Hello %s\n", buffer); return 0; } scanf()함수에서 취약점이 발생한다..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/KgLaD/btqBGrhw6yL/iR5a5NyvFwvCjCwT2HS7cK/img.png)
#include #include #include #include int main() { int var; int check = 0x04030201; char buf[40]; fgets(buf,45,stdin); printf("\n[buf]: %s\n", buf); printf("[check] %p\n", check); if ((check != 0x04030201) && (check != 0xdeadbeef)) printf ("\nYou are on the right way!\n"); if (check == 0xdeadbeef) { printf("Yeah dude! You win!\nOpening your shell...\n"); setreuid(geteuid(), geteuid()); system("/bi..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/c5JevB/btqBzPnVd9h/sESebyrpHEV6Cn2LbdAHO1/img.png)
주석에 PLT라고 되어있다 RET를 strcpy()함수의 PLT주소로 변조해야 하는 문제이다. strcpy()함수의 PLT주소는 0x08048410이다. 값을 넣어주고 코어파일을 분석해보자 0x41414141가 있는 주소 0xbffffa50과 0x45454545가 있는 주소 0xbffffa5c를 사용할것이다. 페이로드는 buffer + sfp + &strcpy() + dummy + &strcpy() arg1 + &strcpy() arg2 + &shellcode [44byte] [4byte] [4byte] [4byte] [4byte] [4byte] #include int main() { printf("%p\n", getenv("shellcode")); return 0; } 쉘 코드 주소를 구하는 소스코드를..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/SI8w5/btqBiloDlM3/PmTR9zfVoKA10Xye1xfjw0/img.png)
ultra argv hunter라는게 추가 되었다 모든 매개변수를 0으로 초기화 하는 코드이다. tmp 디렉토리를 하나 만들어주고 skeleton파일을 복사해주자 tmp 디렉토리로 가서 gdb로 파일을 열어주고 분석해보자 프로그램이 종료 직전의 부분 을 break point를 걸어주고 메모리를 확인해보자 메모리의 끝부분에 파일의 주소가 있다. 파일이름을 쉘 코드로 작성된 심볼릭링크 파일을 만들면 된다. ln -s skeleton $(python -c 'print "\x90" * 100 + "\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/DxRUh/btqBiBEoN2x/QFQJDzF9zbOBJWMASkhU31/img.png)
#include #include #include #include int target; void vuln() { char buffer[512]; fgets(buffer, sizeof(buffer), stdin); printf(buffer); if(target == 64) { printf("you have modified the target :)\n"); } else { printf("target is %d :(\n", target); } } int main(int argc, char **argv) { vuln(); } target의 값을 64로 바꿔줘야한다. AAAA와 %08x 4개를 입력값으로 주니 4번째에서 입력한 AAAA가 보인다. objdump -t 명령으로 target의 주소를 알아냈다. targ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/cBzInA/btqBj5LvYLA/DPWo1DG0wxJOeZRVSsKbdk/img.png)
#include #include #include #include int target; void vuln(char *string) { printf(string); if(target) { printf("you have modified the target :)\n"); } } int main(int argc, char **argv) { vuln(argv[1]); } 이번 문제의 힌트이다. objdump -t 명령으로 target의 주소를 찾아보자 target의 주소는 0x08049638이다. 포맷을 131번 출력하면 \x90 * 4의 90909090이 보인다. 페이로드는 target주소 + .%08x * 129 + .%08n + .%08x target의 값이 변경되어 "you have modified the ..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bdnA1V/btqBf32MNYj/0kPRetwORqjnKd80YAQlek/img.png)
#include #include #include #include char *getpath() { char buffer[64]; unsigned int ret; printf("input path please: "); fflush(stdout); gets(buffer); ret = __builtin_return_address(0); if((ret & 0xb0000000) == 0xb0000000) { printf("bzzzt (%p)\n", ret); _exit(1); } printf("got path %s\n", buffer); return strdup(buffer); } int main(int argc, char **argv) { getpath(); } ret의 시작 주소가 b로 시작하면 안된다. ROP..