일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
- sint
- basic_exploitation_000
- L16
- rev-basic-0
- 드림핵
- rev-basic-5
- RCE
- L17
- Pwnable
- rev-basic-1
- rev-basic-6
- pwnable.kr
- Dreamhack
- L15
- 코드엔진 베이직
- sd카드 리더기
- coin1
- rev-basic-2
- off_by_one_000
- Basic
- rev-basic-4
- rev-basic-3
- off_by_one_001
- 포너블
- out_of_bound
- L18
- CodeEngn
- 코드엔진 베이직 13
- rev-basic-7
- basic_exploitation_001
- Today
- Total
목록Pwnable (26)
서브웨이
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/QrDC3/btraCR69Lhf/LgcwQroNt7KpccS2Rtavt0/img.png)
참고를 보니 정수의 표현범위에 대한 문제로 예상됩니다. 쉘코드와 got 조작은 안됩니다. 소스코드를 봅시다. #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void get_shell() { system("/bin/sh"); } int main() { char buf[256]; int size; initialize(); signal(SIGSEGV, get_shel..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bclmef/btrazNdlHsr/6gIMWux9mDCK7awEPqx1wK/img.png)
이번엔 RELRO, NX bit에 더해서 canary 까지 있는 예제입니다. 쪼끔 귀찮을것 같네요. 소스코드를 봅시다. #include #include #include #include #include char name[16]; char *command[10] = { "cat", "ls", "id", "ps", "file ./oob" }; void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int main() { int idx; i..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/0ibJG/btrat1XAItS/mRFoW2FAvKzhVfCukF11a1/img.png)
이전 문제와 비슷한 유형일 것 같습니다. 일단 소스코드를 봅시다. #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void read_str(char *ptr, int size) { int len; len = read(0, ptr, size); printf("%d", len); ptr[len] = '\0'; } void get_shell() { system("/bi..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/bhUtBT/btraEf0Hr6J/VA9tDNPDI1Y0n9nCqnkNm0/img.png)
자 일단 RELRO랑 NX bit이 적용되어있으니 쉘코드, got 조작은 불가능 합니다. 소스코드를 봅시다. #include #include #include #include #include char cp_name[256]; void get_shell() { system("/bin/sh"); } void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } int cpy() { char real_name[256]; strcpy(real_nam..
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/wyEht/btq99nEHm6b/CwVGfPekQXzeXrpQnZ9HD0/img.png)
예... 뭐... 이걸 풀어야하나 싶지만 그래도 있는 문제니까 풀어봅시다... 그냥 nc 명령어로 접속을 해봅시다. 예... 바로 나옵니다. 그냥 어떻게 진행이 될거다 정도를 알려주는 문제 같습니다.
![](http://i1.daumcdn.net/thumb/C150x150/?fname=https://blog.kakaocdn.net/dn/OzT7D/btq90lPFRkj/TnxKkDIQx4mvc1KK0NvNm0/img.png)
일단 RELRO가 적용되어있고 NX bit이 사용된것으로 보아 got를 임의의 주소로 덮어쓴다거나 쉘코드를 사용하는것은 어려워보입니다. 참고를 보면 결국엔 리턴 주소를 덮어쓰는 방향으로 풀어야할 것 같네요. 소스코드를 봅시다. #include #include #include #include void alarm_handler() { puts("TIME OUT"); exit(-1); } void initialize() { setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); signal(SIGALRM, alarm_handler); alarm(30); } void get_shell() { system("/bin/sh"); } int main(i..