> For the complete documentation index, see [llms.txt](https://giongfnef.gitbook.io/giongfnef/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://giongfnef.gitbook.io/giongfnef/wargame-and-and-others/rootme/app-system/elf-x86-stack-buffer-overflow-basic-2.md).

# ELF x86 - Stack buffer overflow basic 2

```c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
 
void shell() {
    setreuid(geteuid(), geteuid());
    system("/bin/bash");
}
 
void sup() {
    printf("Hey dude ! Waaaaazzaaaaaaaa ?!\n");
}
 
void main()
{
    int var;
    void (*func)()=sup;
    char buf[128];
    fgets(buf,133,stdin);
    func();
}
```

* Về cơ bản ý tưởng vẫn là ghi tràn biến buff để ghi đè giá trị lên biến trước đó&#x20;
* Lúc này chính là địa chỉ của func : `void (*func)()=sup;` , tức là thay vì trỏ tới địa chỉ của sup như thường lệ:

<figure><img src="/files/iZjwksRqT3VnFpHOxiNu" alt=""><figcaption></figcaption></figure>

* Sau khi attack func lúc này sẽ trỏ tới địa chỉ shell và thực thi gọi nó
* Để biết được địa chỉ của hàm shell, ta có thể dùng gdb hoặc pwndbg:

<figure><img src="/files/WhfHU499fGJiD4780fb3" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/q5EmBZ27Wzn3ve8tp2Or" alt=""><figcaption></figcaption></figure>

* Cuối cùng ta chuyển địa chỉ sang little-endian, get shell và cat flag:

<figure><img src="/files/P8sbwE9uFfddph6Lcykk" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/m1zQaXLcoQ8mJwJBeMGe" alt=""><figcaption></figcaption></figure>

> flag: B33r1sSoG0oD4y0urBr4iN
